none
3個tables相關聯的語法... RRS feed

  • 問題

  • 抱歉,小弟又有語法上的疑惑,實在學淺,要請教各位先進..

    我的資料庫裡有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丙裡頭的資料...
    請各位先進幫幫我.

    感激不盡.


    2013年7月20日 上午 11:22

解答

所有回覆

  • 這用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


    保證解答-微軟技術支援服務

    2013年7月21日 下午 10:01
    版主
  • 我也是覺得用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'
    
    


    以上說明若有錯誤請指教,謝謝。

    | 台灣 SQL PASS 社群 | SQL PASS Taiwan

    | 歡迎參觀我的BLOG - 積沙成塔

    2013年7月22日 上午 06:22
    版主
  • 謝謝你的指導.

    在SQL SERVER 查詢裡修改一些東西後(比如TABLE甲乙丙是本來就存在的,DISTINCT這個參數不是我要的)作執行,
    出來的結果完全符合我的需求.

    太感謝了.

    我真的覺得SELECT 好複雜...簡單的一個指令開頭,卻可以是千變萬化,滿足不同的需求.
    2013年7月22日 上午 07:48
  • 謝謝您的回答.
    我也會用您的方式來試看看.

    年近半百才來學SQL,多練習不同的寫法,對我熟悉SQL會有很大幫助.
    謝謝您.
    _
    2013年7月22日 上午 07:50