我需要从表A中获取同样在表B中的匹配记录。但我无法弄清楚我是否可以在一个查询中执行此操作。
表A
id | order_id | title
----------------------------------
1 | 1114 | Product 1
2 | 1115 | Product 1
3 | 1115 | Product 2
4 | 1116 | Product 1
5 | 1117 | Product 3
6 | 1118 | Product 4
7 | 1118 | Product 5
表B
id | order_id | a_id | title
----------------------------------
1 | 2221 | 1 | Product 1
2 | 2222 | 2 | Product 1
3 | 2222 | 3 | Product 2
4 | 2223 | 7 | Product 5
现在我需要表A中的所有order_id
值,其中所有产品也在表B中。因此,这将导致:
1114
1115
1116失败,因为没有b.a_id
值4
1117失败,因为没有b.a_id
值5
1118失败,因为6
和7
都不在b.a_id
我尝试了INNER JOIN
,但这也会返回1118
。我还尝试LEFT JOIN
与WHERE b.a_id IS NULL
,但恰恰相反。所以我尝试了RIGHT JOIN
,但这也会返回1118
。
请参阅此SQL Fiddle。
我希望我明确了我的目标是什么,如果可以通过一个查询管理,我很好奇。
答案 0 :(得分:1)
它并不完美,但它确实通过SQL Fiddle返回现有数据的正确结果。也许你可以用它作为起点?
SELECT a.order_id, count(distinct a.id) as aCount, count(distinct b.a_id) as bCount
FROM a
LEFT JOIN b ON a.id = b.a_id
GROUP BY a.order_id
HAVING aCount = bCount;
答案 1 :(得分:1)
在单个查询中可以使用:
SELECT a.order_id, COUNT(a.id) as cntA, COUNT(b.id) AS cntB
FROM a
LEFT JOIN b ON a.id = b.a_id
GROUP BY a.order_id
HAVING cntA = cntB;