我有两个销售信息表,它们的行数不同,我想获得这些行。需要注意的重要一点是,记录是通过两列的关键字添加到表中的:sale_type
和sale_date
。
因此,我认为在对两个表进行合并之后,应该对这些列进行分组。并按计数过滤。但是我当前的解决方案不起作用。我应该如何正确获取不匹配的记录?
这是我尝试过的:
SELECT * FROM
(SELECT * FROM sales_copy
UNION ALL
SELECT * FROM sales)
GROUP BY sale_type, sale_date
HAVING count(*)!=1;
答案 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)
您可以同时使用EXCEPT
和UNION
运算符:
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_copy
和rows 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