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
您的問題,大概想了一下,您應該是要做 表A 的排列組合,然後以 表B 的條件來加以限制
又一您所提,查詢的結果會有一筆、兩筆、三筆的形態,但您只提供一筆、兩筆的規則,
但從您前面的提示中,ABD 是可以查到的,所以假設三筆的條件是每一個資料皆需存在於 表B 中(但沒有群組關係)
所以我設計了三個 View 來表示一筆、兩筆、三筆的狀況
一筆
<pre class="c" name="code">
SELECT DISTINCT Sign AS 符號
FROM dbo.A
WHERE (Sign IN
(SELECT Sign
FROM B))
二筆
<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 <> A_1.Sign
WHERE ((SELECT SEQ
FROM B
WHERE Sign = A.Sign) =
(SELECT SEQ
FROM B
WHERE Sign = A_1.Sign))
三筆
<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 <> A_1.Sign INNER JOIN
dbo.A A_2 ON A_2.Sign <> dbo.A.Sign AND A_2.Sign <> 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