如何检索包含其他元素的所有项的结果集?

b1uwtaje  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(265)

我将用下面的场景简单地解释用例。基本上,我想从包含pl001的所有订单的pts\表中找到所有的pts/s

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.

但不幸的是,这个查询同时返回pts001和pts002,这是不正确的。它应该只返回pts001作为结果!。当我发现这是由于不正确的分组部分。
有人能给我建议如何纠正这个问题或其他更好的方法吗?非常感谢您的帮助。

eagi6jfj

eagi6jfj1#

这很棘手。它是检查匹配的订单数量,而不是不匹配的订单数量。因此,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
aelbi1ox

aelbi1ox2#

考虑以下几点。。。

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;

返回101
http://sqlfiddle.com/#!2011年9月26日

相关问题