2016-12-01 55 views
2

我在SQL Server中的兩個表,如何在SQL中查找與另一個表中匹配的表的行組?

Declare @Table1 Table (TID1 INT, TP1 INT) 

Declare @Table2 Table (TID2 INT, TP2 INT) 


INSERT INTO @Table1 (TID1,TP1) VALUES (100,1) 
INSERT INTO @Table1 (TID1,TP1) VALUES (100,2) 
INSERT INTO @Table1 (TID1,TP1) VALUES (100,3) 

INSERT INTO @Table2 (TID2,TP2) VALUES (101,1) 
INSERT INTO @Table2 (TID2,TP2) VALUES (101,2) 
INSERT INTO @Table2 (TID2,TP2) VALUES (101,3) 
INSERT INTO @Table2 (TID2,TP2) VALUES (102,1) 
INSERT INTO @Table2 (TID2,TP2) VALUES (102,2) 
INSERT INTO @Table2 (TID2,TP2) VALUES (103,1) 
INSERT INTO @Table2 (TID2,TP2) VALUES (103,2) 
INSERT INTO @Table2 (TID2,TP2) VALUES (103,3) 
INSERT INTO @Table2 (TID2,TP2) VALUES (103,4) 
INSERT INTO @Table2 (TID2,TP2) VALUES (104,2) 
INSERT INTO @Table2 (TID2,TP2) VALUES (105,3) 

有數據爲:

TID1  TP1 
----------- ----------- 
100   1 
100   2 
100   3 


TID2  TP2 
----------- ----------- 
101   1 
101   2 
101   3 
102   1 
102   2 
103   1 
103   2 
103   3 
103   4 
104   2 
105   3 

我想選擇其中具有表2中TP2 TP1列列的精確匹配這些記錄。具有ID 101的EX TID2將僅在結果集中

+0

你的意思精確匹配,和你有什麼預期的結果? –

+0

不清楚。表1中的TP1的值爲2,表2中的TP2中的值爲2。爲什麼這應該被排除? –

+0

103也是你的結果集的一部分呢? – Buddi

回答

3
SELECT t2.TID2 
FROM @Table2 t2 
LEFT JOIN @Table1 t1 
    ON t2.TP2 = t1.TP1 
GROUP BY t2.TID2 
HAVING SUM(CASE WHEN t1.TP1 IS NULL THEN 1 ELSE 0 END) = 0 AND 
     COUNT(*) = (SELECT COUNT(*) FROM @Table1) 
+0

是的,'COUNT(*)= 3'解決了這個問題,但我會使用'(SELECT COUNT(*)FROM Table1)'代替硬代碼3。 –

0

嘗試如下。

SELECT TID2 
FROM @TABLE1 T 
     RIGHT JOIN @TABLE2 T2 
     ON T.TP1 = T2.TP2 
GROUP BY TID2 
HAVING COUNT(T2.TP2) = (SELECT COUNT(*) FROM @TABLE1) 
0
-- you can calculated this in CTEW or sub-query if you do not like to be in variable 
DECLARE @MaxRowsCount INT = (SELECT COUNT(*) FROM @Table1); 

SELECT T2.[TID2] 
FROM @Table2 T2 
LEFT JOIN @Table1 T1 
    ON T2.[TP2] = T1.[TP1] 
GROUP BY T2.[TID2] 
HAVING 
(
    -- current count of rows should be the same as the row count from the first table 
    COUNT(T2.[TP2]) = @MaxRowsCount 
) 
相關問題