最佳解答者
3個tables相關聯的語法...

問題
-
抱歉,小弟又有語法上的疑惑,實在學淺,要請教各位先進..
我的資料庫裡有3個tables,假設是甲,乙,丙
甲裡頭有五個欄位: mark ,A,B,C,D (mark是記號,內容可能是任何一個字母作為其記號)
乙裡頭有五個欄位:A,B,C,D,C_NO (A,B,C,D 同 table甲的同名且內容相關之欄位)
丙裡頭有幾個個欄位,其中有關連的是 C_NO,C_NAME,C_ADDRESS,C_TEL.... (C_NO同TABLE乙的同名欄位)..
有點難以描述,我盡可能說的清楚點...
我想要藉由 篩選出所有 table甲.mark="W"的記錄,
以甲所得的紀錄,每一筆的(A.B.C.D)關連到TABLE乙的(A B C D)..也就是
(甲.A+甲.B+甲.C+甲.D)=(乙.A+乙.B+乙.C+乙.D),得到所有符合的紀錄...
再由上頭乙所得的紀錄,其中的乙.C_NO,關連到TABLE丙...也就是 乙.C_NO=丙.C_NO ....,
最後得到所有符合之丙的紀錄,取得(列出)丙的 c_no,c_name,c_address,c_tel ..
呃..不知道這樣寫夠不夠清楚...
請問有沒有可能用一段的 SELECT 語法,來達到上頭我想要作的事呢 ??
小弟我想來想去,都不知道該如何去組合出一段SELECT的語法,來達到我想要篩選出TABLE丙裡頭的資料...
請各位先進幫幫我.
感激不盡.
解答
-
這用join就可以了,參考看看
--甲
declare @A table
(
c1 int,
c2 int,
c3 int,
c4 int,
mark char(1)
)--乙
declare @B table
(
c1 int,
c2 int,
c3 int,
c4 int,
C_NO int
)--丙
declare @C table
(
C_NO int,
c_name nvarchar(40),
c_address nvarchar(200),
c_tel varchar(12)
)--result
select distinct t3.C_NO,t3.c_name,t3.c_address,t3.c_tel
from
(
select distinct t2.C_NO
from @A t1 join @B t2
on t1.c1=t2.c1
and t1.c2=t2.c2
and t1.c3=t2.c3
and t1.c4=t2.c4
where t1.mark='W'
) base join @C t3
on base.C_NO=t3.C_NO
保證解答-微軟技術支援服務
- 已提議為解答 TerryChuangModerator 2013年7月22日 上午 03:17
- 已標示為解答 Zico Song 2013年7月22日 上午 07:48
所有回覆
-
這用join就可以了,參考看看
--甲
declare @A table
(
c1 int,
c2 int,
c3 int,
c4 int,
mark char(1)
)--乙
declare @B table
(
c1 int,
c2 int,
c3 int,
c4 int,
C_NO int
)--丙
declare @C table
(
C_NO int,
c_name nvarchar(40),
c_address nvarchar(200),
c_tel varchar(12)
)--result
select distinct t3.C_NO,t3.c_name,t3.c_address,t3.c_tel
from
(
select distinct t2.C_NO
from @A t1 join @B t2
on t1.c1=t2.c1
and t1.c2=t2.c2
and t1.c3=t2.c3
and t1.c4=t2.c4
where t1.mark='W'
) base join @C t3
on base.C_NO=t3.C_NO
保證解答-微軟技術支援服務
- 已提議為解答 TerryChuangModerator 2013年7月22日 上午 03:17
- 已標示為解答 Zico Song 2013年7月22日 上午 07:48
-
我也是覺得用JOIN應該就可以滿足你的需求,或許您也可以參考下列的程式碼:
declare @t1 table (mark char(1),A int, B int,C int,D int) --table甲 declare @t2 table (C_NO int,A int, B int,C int,D int) --table乙 declare @t3 table (C_NO int,C_NAME varchar(50), C_ADDRESS varchar(50),C_TEL varchar(50)) --table丙 insert into @t1 values('A',1,2,3,4),('B',2,3,4,5),('C',3,4,5,6),('D',4,5,6,7),('W',5,6,7,8) insert into @t2 values(100,11,22,33,44),(200,22,33,44,55),(300,33,44,55,66),(400,44,55,66,77),(500,5,6,7,8),(600,5,6,7,8) insert into @t3 values (100,'name1','addr1','123'),(200,'name2','addr2','345'),(300,'name3','addr3','567'),(400,'name4','addr4','789'),(500,'name5','addr5','012') select c.* from @t1 a inner join @t2 b on a.A = b.A and a.B = b.B and a.C = b.C and a.D = b.D inner join @t3 c on b.C_NO = c.C_No where a.mark = 'W'
以上說明若有錯誤請指教,謝謝。