仅输出具有相同ID的

时间:2019-05-21 07:30:35

标签: sql postgresql

SELECT   id,
         account_id,
         move_id
FROM     account_move_line 
WHERE    account_id IN
         (SELECT account_id
          FROM account_move_line 
          GROUP BY account_id HAVING COUNT(id) > 1) 
AND      account_id = 1974

数据输出为:

______________________________
|id      |account_id |move_id
| 41623  |    1974   |  8865
| 41624  |    1974   |  8865
| 45229  |    1974   |  9289
| 1208   |    1974   |  104
| 39628  |    1974   |  8168
| 39629  |    1974   |  8168

正如您在第一行和第二行中看到的那样,move_id是相同的。
在输出的最后两行中,move_id再次相同。
如何更新我的查询,即只有move_id相同时输出才是?
因此,基本上应该没有ID为45229和1208的行。

3 个答案:

答案 0 :(得分:1)

我认为您应使用MOV ID而不是如下的account_id-

SELECT 
id, 
account_id , 
move_id 
FROM account_move_line 
WHERE move_ID in 
(
    SELECT move_ID
    FROM account_move_line 
    GROUP BY move_ID 
    HAVING COUNT(move_ID) > 1
) 
AND account_id = 1974

答案 1 :(得分:1)

使用相关子查询

select id, account_id , move_id
from account_move_line a
where exists (select 1 from account_move_line b where a.move_id=b.move_id
                     group by b.account_id
                     having count(distinct id) > 1 and account_id = 1974) 
  and account_id = 1974

答案 2 :(得分:1)

如果您完全关心性能,我建议您仅使用exists而不是在子查询中使用聚合。

所以:

SELECT aml.id, aml.account_id, aml.move_id
FROM account_move_line aml
WHERE aml.account_id = 1974 AND
      EXISTS (SELECT 1
              FROM account_move_line aml2
              WHERE aml2.account_id = aml.account_id AND
                    aml2.move_id = aml.move_id AND
                    aml2.id <> aml.id
             );