我有两个表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