【发布时间】:2019-07-29 16:04:21
【问题描述】:
给定一张桌子
CREATE TABLE data(
irs_number VARCHAR (50),
mop_up INTEGER,
ou VARCHAR (50)
);
我将如何返回所有匹配的记录...
- 在另一行中至少有一个与
irs_number相同的值,并且 - 必须将具有相同
irs_number的mop_up中的至少一个设置为1AND -
ou的值不相同,即只返回那些不匹配到具有相同irs_number的行的值。
... 这样所有irs_numbers 都将被返回(不仅仅是一个条件为真的——见下面的例子)。
我试过了,但查询无法在合理的时间内完成:
SELECT irs_number, mop_up, ou
FROM data outer_data
WHERE (SELECT count(*)
FROM data inner_data
WHERE inner_data.irs_number = outer_data.irs_number
AND inner_data.mop_up = 1 OR outer_data.mop_up = 1
AND inner_data.ou <> outer_data.ou
);
以及此处描述的重复计数的变化:How to find duplicate records in PostgreSQL - 他们将始终只返回重复项,而不是应用的正确过滤器。
编辑:
示例数据:
INSERT INTO data VALUES
('0001', 1, 'abc'),
('0001', 0, 'abc'),
('0001', 0, 'cde'),
('0001', 0, 'abc'),
('0002', 1, 'abc'),
('0002', 0, 'abc'),
('0003', 0, 'abc'),
('0003', 0, 'xyz')
;
SQLFiddle:http://sqlfiddle.com/#!17/be28f
理想情况下,查询应该返回:
irs_number mop_up ou
-----------------------
0001 1 abc
0001 0 abc
0001 0 cde
0001 0 abc
(顺序不重要)
这意味着它应该返回与irs_number 匹配的所有行与上述条件。
【问题讨论】:
标签: sql postgresql