SQL - 如何检索包含另一个元素的所有项目的结果集?
SQL - How to retrieve the result set containing all items of another element?
我将通过以下场景简单地解释用例。
基本上,我想从 pts_table 中找到所有 pts/s,其中包含 pl001
的所有订单
pl_table
========
pl_id | order_id
pl001 order001
pts_table
=========
pts_id | order_id
pts001 order001
pts002 order001
pts002 order002
这是我正在尝试的查询,
SELECT pts_id
FROM pts_table
WHERE pts_table.order_id IN (SELECT DISTINCT(plt.order_id) FROM pl_table
as plt where plt.pl_id=pl001)// to check element equality.
GROUP BY pts_id
HAVING COUNT(DISTINCT pts_table.order_id) = (SELECT COUNT(plt2.order_id)
FROM pl_table as plt2 where plt.pl_id=pl001)//to check size equality.
但不幸的是,此查询 return 不是 correct.it 的 pts001 和 pts002 应该只有 return pts001 作为结果!。
我发现这是由于分组部分不正确造成的。
任何人都可以建议我如何纠正这个问题或任何其他更好的方法吗?
非常感谢任何帮助。
这很棘手。它正在检查 匹配 的订单数,而不是不匹配的订单数。因此,pl002 没有进入计数。
SELECT p.pts_id
FROM pts_table p LEFT JOIN
pl_table p2
ON p.order_id = p2.order_id AND p2.pl_id = 'pl001'
GROUP BY p.pts_id
HAVING COUNT(*) = COUNT(p2.order_id) AND -- All match
COUNT(*) = (SELECT COUNT(*) FROM pl_table WHERE pl.pl_id = 'pl001') -- match all of them
考虑以下...
create table pl
(pl_id serial primary key
,order_id int not null
);
insert into pl values
(1,101);
create table pts
(pts_id int not null
,order_id int not null
,primary key(pts_id,order_id)
);
insert into pts values
(1001,101),
(1002,101),
(1002,102);
SELECT DISTINCT a.*
FROM pts a
LEFT
JOIN
( SELECT DISTINCT x.*
FROM pts x
LEFT
JOIN pl y
ON y.order_id = x.order_id
AND y.pl_id = 1
WHERE y.pl_id IS NULL
) b
ON b.pts_id = a.pts_id
WHERE b.pts_id IS NULL;
Returns 101
我将通过以下场景简单地解释用例。 基本上,我想从 pts_table 中找到所有 pts/s,其中包含 pl001
的所有订单 pl_table
========
pl_id | order_id
pl001 order001
pts_table
=========
pts_id | order_id
pts001 order001
pts002 order001
pts002 order002
这是我正在尝试的查询,
SELECT pts_id
FROM pts_table
WHERE pts_table.order_id IN (SELECT DISTINCT(plt.order_id) FROM pl_table
as plt where plt.pl_id=pl001)// to check element equality.
GROUP BY pts_id
HAVING COUNT(DISTINCT pts_table.order_id) = (SELECT COUNT(plt2.order_id)
FROM pl_table as plt2 where plt.pl_id=pl001)//to check size equality.
但不幸的是,此查询 return 不是 correct.it 的 pts001 和 pts002 应该只有 return pts001 作为结果!。 我发现这是由于分组部分不正确造成的。
任何人都可以建议我如何纠正这个问题或任何其他更好的方法吗? 非常感谢任何帮助。
这很棘手。它正在检查 匹配 的订单数,而不是不匹配的订单数。因此,pl002 没有进入计数。
SELECT p.pts_id
FROM pts_table p LEFT JOIN
pl_table p2
ON p.order_id = p2.order_id AND p2.pl_id = 'pl001'
GROUP BY p.pts_id
HAVING COUNT(*) = COUNT(p2.order_id) AND -- All match
COUNT(*) = (SELECT COUNT(*) FROM pl_table WHERE pl.pl_id = 'pl001') -- match all of them
考虑以下...
create table pl
(pl_id serial primary key
,order_id int not null
);
insert into pl values
(1,101);
create table pts
(pts_id int not null
,order_id int not null
,primary key(pts_id,order_id)
);
insert into pts values
(1001,101),
(1002,101),
(1002,102);
SELECT DISTINCT a.*
FROM pts a
LEFT
JOIN
( SELECT DISTINCT x.*
FROM pts x
LEFT
JOIN pl y
ON y.order_id = x.order_id
AND y.pl_id = 1
WHERE y.pl_id IS NULL
) b
ON b.pts_id = a.pts_id
WHERE b.pts_id IS NULL;
Returns 101