iT邦幫忙

0

一個很難的sql問題

  • 分享至 

  • xImage

SQL 高手們請教一下這樣有辦法下出SQL嗎? 因為我真的是想破頭加上SQL很差>"<所以才來求救,或是這個規則是否有邏輯上的問題?謝謝
1.表A與表B用「符號」關聯
2.表B SEQ 相同為同一群組 EX:表B的AB為同一群組, YZ也是同一群組
3.若查詢表A的資料 select * from 表A 有可能為1-3筆 EX: 結果可能為 A 或 AB 或 AD 或AS 或 ABD等等
4.表B select * from 表B 只有表b那些資料
5.條件 當我查詢表A時比對表B 結果如下
規則一,若表A 1.查詢結果只有一筆為A 並比對表B ,A必須存在表B的符號裡, (資料顯示為A)
2.查詢結果只有一筆為S 並比對表B ,它不在表B中,所以是錯的 (資料不顯示)

規則二,若表A 1.查詢結果有二筆為AB 並比對表b ,AB必須存在表B,且為同一群組,結果為 (資料顯示為A或B其中一筆)
2.查詢結果有二筆為AD 並比對表b ,AD必須存在表B,且為同一群組,結果為 (資料不顯示)因為AD不在表B的同一群組裡
3.查詢結果有二筆為AS 並比對表b ,AS必須存在表B,且為同一群組,結果為 (資料不顯示)因為S不在表B裡

規則三,若表A 1.查詢結果有二筆為AA 並比對表b ,AA必須存在表B,且為同一群組,結果為 (資料不顯示)雖然AA是在表B的資料裡,且也是同一群組資料,但資料都是A所以不算

表A
ID 符號
1 A
2 B
3 D
4 S
5 A
表B
SEQ 符號
1 A
1 B
2 C
2 D
3 Y
3 Z

看更多先前的討論...收起先前的討論...
jamesjan iT邦高手 1 級 ‧ 2009-11-01 14:04:39 檢舉
嗯,這題目確實很難...
很難理解...XD
misadm iT邦高手 10 級 ‧ 2009-11-02 08:14:39 檢舉
看不懂 +1
您是在設計 Table 還是要 查詢Table
感覺好像在設計?
bread520 iT邦新手 5 級 ‧ 2009-11-06 23:21:45 檢舉
^^sorry 我寫的太複雜了,真的很難理解,我會多參考前輩們的文章的^^謝謝
bread520 iT邦新手 5 級 ‧ 2009-11-06 23:23:21 檢舉
我只是要查詢table而己,因為基礎不好條件太多一時之間被迷惑了>"<
bread520 iT邦新手 5 級 ‧ 2009-11-06 23:24:16 檢舉
sorry ^^下次改進^^謝謝你的回答喔
不僅寫出正解
還能看懂題目

jamesjan大大
真●強人也
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

12
jamesjan
iT邦高手 1 級 ‧ 2009-11-02 17:38:12
最佳解答

您的問題,大概想了一下,您應該是要做 表A 的排列組合,然後以 表B 的條件來加以限制
又一您所提,查詢的結果會有一筆、兩筆、三筆的形態,但您只提供一筆、兩筆的規則,
但從您前面的提示中,ABD 是可以查到的,所以假設三筆的條件是每一個資料皆需存在於 表B 中(但沒有群組關係)

所以我設計了三個 View 來表示一筆、兩筆、三筆的狀況
一筆

&lt;pre class="c" name="code">
SELECT DISTINCT Sign AS 符號
FROM             dbo.A
WHERE         (Sign IN
                              (SELECT         Sign
                                FROM              B))

二筆

&lt;pre class="c" name="code">
SELECT DISTINCT dbo.A.Sign AS 符號1, A_1.Sign AS 符號2
FROM             dbo.A INNER JOIN
                          dbo.A A_1 ON dbo.A.Sign &lt;> A_1.Sign
WHERE         ((SELECT         SEQ
                             FROM             B
                             WHERE         Sign = A.Sign) =
                              (SELECT         SEQ
                                FROM              B
                                WHERE          Sign = A_1.Sign))

三筆

&lt;pre class="c" name="code">
SELECT DISTINCT dbo.A.Sign AS 符號1, A_1.Sign AS 符號2, A_2.Sign AS 符號3
FROM             dbo.A INNER JOIN
                          dbo.A A_1 ON dbo.A.Sign &lt;> A_1.Sign INNER JOIN
                          dbo.A A_2 ON A_2.Sign &lt;> dbo.A.Sign AND A_2.Sign &lt;> A_1.Sign AND 
                          dbo.A.Sign IN
                              (SELECT         sign
                                FROM              B) AND A_1.Sign IN
                              (SELECT         sign
                                FROM              B) AND A_2.Sign IN
                              (SELECT         sign
                                FROM              B)

其執行結果如下:
一筆

二筆

三筆

如果結果有出入,可能再檢視一下條件,修該一下應該就 OK

bread520 iT邦新手 5 級 ‧ 2009-11-06 23:20:41 檢舉

謝謝你的回答,這就是我要的^^謝謝

我要發表回答

立即登入回答