我知道這個話題充其量有點模糊,但找不到更好地描述我的問題的方法......
例如,我有以下兩個表:
表A
| 艾達 | 代碼 | 價值 |
|---|---|---|
| 123 | 一種 | 1 |
| 123 | 乙 | 2 |
| 123 | C | 3 |
| 456 | 一種 | 4 |
| 456 | F | 6 |
| 456 | 乙 | 7 |
| ... |
表B
| 分貝 | 代碼 | 價值 |
|---|---|---|
| X | 一種 | 1 |
| X | 乙 | 2 |
| X | C | 3 |
| 是 | G | 2 |
| 是 | D | 8 |
| 是 | C | 3 |
| Z | 一種 | 1 |
| Z | 乙 | 2 |
| Z | C | 3 |
| Z | D | 5 |
| ... |
TableA 中給定 IdA 的一組記錄與 TableB 中具有特定 IdB 的一組等效記錄相關。
例如,對于 TableA 中的 IdA = 123,我正好有三行具有某些代碼和值,這將“映射”到 TableB 中 IdB = X 的行,因為它具有相同的代碼和值組合以及相同的行數. 請注意,它不會映射到 TableB 中的 IdB = Z,因為它有一個額外的代碼 D 行,而 IdA = 123 在 TableA 中沒有。
僅給定 IdA,如何最好地撰寫查詢以查找 IdB?
如果代碼和值是已知的,我可以做類似的事情:
SELECT b.IdB FROM TableB b
WHERE
EXISTS(SELECT * FROM TableB x WHERE x.IdB = b.IdB AND x.Code = 'A' AND x.Value = '1') AND
EXISTS(SELECT * FROM TableB x WHERE x.IdB = b.IdB AND x.Code = 'B' AND x.Value = '2') AND
EXISTS(SELECT * FROM TableB x WHERE x.IdB = b.IdB AND x.Code = 'C' AND x.Value = '3') AND
(SELECT COUNT(*) FROM TableB x WHERE x.IdB = b.IdB) = 3
但是現在我只得到了 IdA 的值,所以我需要從 TableA 中查找值并將其組合到 TableB 的查詢中。關于如何解決這個問題的任何聰明的想法?
uj5u.com熱心網友回復:
這是一個沒有余數的關系除法問題。
有很多解決方案,這里是一個:
- Take
TableBand left 加入TableA它 - 但是計算來自 A 的整個值集的總數
- 通過...分組
IdB - 過濾,所以我們只有總計數等于 A 匹配數的行(因為
COUNT(IdA)只計算非空值)并且總計數也必須與我們想要匹配的總行數相同。
DECLARE @idA int = 123;
SELECT
b.IdB
FROM TableB b
LEFT JOIN (
SELECT *,
total = COUNT(*) OVER ()
FROM TableA a
WHERE a.IdA = @idA
) a ON b.Code = a.Code AND b.Value = a.Value
GROUP BY
b.IdB
HAVING COUNT(*) = COUNT(a.IdA)
AND COUNT(*) = MIN(a.total);
資料庫<>小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/323251.html
下一篇:旋轉但處理列名
