从按两列分组的两个表中选择不匹配的行

时间:2018-07-10 12:36:55

标签: sql postgresql

我有两个销售信息表,它们的行数不同,我想获得这些行。需要注意的重要一点是,记录是通过两列的关键字添加到表中的:sale_typesale_date

因此,我认为在对两个表进行合并之后,应该对这些列进行分组。并按计数过滤。但是我当前的解决方案不起作用。我应该如何正确获取不匹配的记录?

这是我尝试过的:

SELECT * FROM
(SELECT * FROM sales_copy
UNION ALL  
SELECT * FROM sales)
GROUP BY sale_type, sale_date
HAVING count(*)!=1;

2 个答案:

答案 0 :(得分:1)

要选择两个表之间的差异,我设法使用完全联接成功地做到了这一点。 因此,在您的情况下,您需要以下内容:

SELECT S.*, SC.*
FROM sales AS S
FULL JOIN sales_copy AS SC ON (S.sale_type = SC.sale_type) AND (S.sale_date = 
SC.sale_date
WHERE (S.sale_type IS NULL AND S.sale_date IS NULL) OR (SC.sale_type IS NULL AND 
SC.sale_date IS NULL)

此操作的结果将只选择一个表中的所有行,而忽略两个表中的行。

在此处查看实际操作:SQL Fiddle

答案 1 :(得分:1)

您可以同时使用EXCEPTUNION运算符:

SELECT sale_type, sale_date FROM sales EXCEPT SELECT sale_type,sale_date FROM sales_copy
UNION
SELECT sale_type, sale_date FROM sales_copy EXCEPT SELECT sale_type,sale_date FROM sales

它返回rows from sales wich are not in sales_copyrows from sales_copy wich are not in sales

full join可以通过过滤匹配的行来实现相同的目的:

SELECT    ISNULL(sales.sale_type, sales_copy.sale_type) AS sale_type
        , ISNULL(sales.sale_date, sales_copy.sale_date) AS sale_date
FROM      sales
FULL JOIN sales_copy
       ON sales.sale_type = sales_copy.sale_type
      AND sales.sale_date = sales_copy.sale_date
WHERE     sales.sale_type IS NULL
       OR sales_copy.sale_type IS NULL