我有兩個表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
我有兩個表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
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的大小增長,這種類型的查詢會很快在性能降低。這是因爲索引在這裏實際上並沒有多大幫助。
它仍然是一個有用的結構,但不是一個地方,我建議在運行實時查詢。而是使用它來創建另一個持久化/緩存結果集,並僅在需要時使用它來刷新這些結果。
你的解釋不是很清楚。我想你想從表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
(民主黨,你比我:)更快)
小心重複記錄。如果任何一個表都可能有重複項,則需要將其計入您的計數中。 – MatBailie 2012-04-11 09:48:32
或者一個稍微便宜的版本(資源英明):
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
你可以在數據如何更具體一點這兩個表格是相關的,你的預期結果是什麼? – 2012-04-11 09:24:26
對不起,我真的不明白你在這裏問什麼... – Marco 2012-04-11 09:24:32
對不起,應該讀,從表A返回9,1,希望更清楚。我需要在比賽中的表B中的所有記錄表A – Jules 2012-04-11 09:26:04