2012-04-11 107 views
2

我有兩個表SQL,只有匹配所有外鍵值才能返回記錄?

Table A 
type_uid, allowed_type_uid 
9,1 
9,2 
9,4 
1,1 
1,2 
24,1 
25,3 

Table B 
type_uid 
1 
2 

從表AI需要返回

9 
1 

使用WHERE IN條款我可以返回

9 
1 
24 
+0

你可以在數據如何更具體一點這兩個表格是相關的,你的預期結果是什麼? – 2012-04-11 09:24:26

+1

對不起,我真的不明白你在這裏問什麼... – Marco 2012-04-11 09:24:32

+0

對不起,應該讀,從表A返回9,1,希望更清楚。我需要在比賽中的表B中的所有記錄表A – Jules 2012-04-11 09:26:04

回答

3
SELECT 
    TableA.type_uid 
FROM 
    TableA 
INNER JOIN 
    TableB 
    ON TableA.allowed_type_uid = TableB.type_uid 
GROUP BY 
    TableA.type_uid 
HAVING 
    COUNT(distinct TableB.type_uid) = (SELECT COUNT(distinct type_uid) FROM TableB) 

加入兩個表togeter,所以你只有記錄符合你感興趣的類型i ñ。

組的結果通過TableA.type_uid設置。

檢查每個組具有相同數量的allowed_type_uid值作爲存在於TableB.type_uid

distinct需要只有如果可以在任一表中重複的記錄。如果表知道只有唯一值,該distinct可以被刪除。


還應當指出的是,表A的大小增長,這種類型的查詢會很快在性能降低。這是因爲索引在這裏實際上並沒有多大幫助。

它仍然是一個有用的結構,但不是一個地方,我建議在運行實時查詢。而是使用它來創建另一個持久化/緩存結果集,並僅在需要時使用它來刷新這些結果。

0

你的解釋不是很清楚。我想你想從表A中得到那些type_uid,其中表B中的所有記錄都有一個匹配的A.Allowed_type_uid。

SELECT T2.type_uid 
FROM (SELECT COUNT(*) as AllAllowedTypes FROM #B) as T1, 
    (SELECT #A.type_uid, COUNT(*) as AllowedTypes 
    FROM #A 
     INNER JOIN #B ON 
      #A.allowed_type_uid = #B.type_uid 
    GROUP BY #A.type_uid 
    ) as T2 
WHERE T1.AllAllowedTypes = T2.AllowedTypes 

(民主黨,你比我:)更快)

+0

小心重複記錄。如果任何一個表都可能有重複項,則需要將其計入您的計數中。 – MatBailie 2012-04-11 09:48:32

1

或者一個稍微便宜的版本(資源英明):

SELECT 
    Data.type_uid 
FROM 
    A AS Data 
    CROSS JOIN 
    B 
    LEFT JOIN 
    A 
    ON Data.type_uid = A.type_uid AND B.type_uid = A.allowed_type_uid 
GROUP BY 
    Data.type_uid 
HAVING 
    MIN(ISNULL(A.allowed_type_uid,-999)) != -999 
相關問題