识别2个表中的不同行

时间:2012-09-18 19:22:16

标签: mysql join group-by distinct

假设我有两个结构相同的表,称之为A& B.此问题唯一关注的列是product_type,price和volume。

product_type&的每个组合。价格可能会在每张表中重复多次,且数量不一。我试图在一个表中找到一个组合的实例,而另一个表中的TOTAL体积不同。

这将包括表A中的组合未在表B中表示的任何情况,反之亦然。

===================

示例:

表A:

ID   Product_type   Price  Volume
---  ------------   -----  ------
1         X           $1     10
2         X           $1     11
3         Z           $2     10

表B:

ID   Product_type   Price  Volume
--   -------------  -----  -------
1         X           $1     21
2         Y           $1     5
3         Z           $2     7
4         Z           $2     4

请注意,表A中X @ $ 1的卷总和为21,与表B相匹配。 表B中存在Y @ $ 1,但不存在于A. Z @ $ 2存在于两个表中,但它们的总和不同。我希望查询返回违反规则的每个product_type和价格组合(即Y @ $ 1和Z @ $ 2)。

我尝试过使用GROUP,UNION,DISTINCT,子查询以及上面的各种组合,但似乎无法弄明白。

3 个答案:

答案 0 :(得分:1)

我相信您正在寻找以下内容。我为语法中的奇怪位置/不道歉,使用concat中的子查询这似乎是最可读的方法。

(
SELECT
  "TableA",
  TA.*

FROM TableA AS TA

WHERE CONCAT(product_type, price,
             (SELECT SUM(volume) FROM TableA WHERE product_type = TA.product_type AND price = TA.price))

NOT IN (SELECT CONCAT(product_type, price, SUM(volume)) FROM TableB GROUP BY product_type, price)
)

UNION

(
SELECT
  "TableB",
  TB.*

FROM TableB AS TB

WHERE CONCAT(product_type, price,
             (SELECT SUM(volume) FROM TableB WHERE product_type = TB.product_type AND price = TB.price))

NOT IN (SELECT CONCAT(product_type, price, SUM(volume)) FROM TableA GROUP BY product_type, price)
)

#ORDER BY <column>

输出:

TableA  ID  Product_type  Price  Volume
TableA  3   Z             $2     10
TableB  2   Y             $1     5
TableB  3   Z             $2     7
TableB  4   Z             $2     4

答案 1 :(得分:0)

create table a (ID integer, Product_type char(1), Price float, Volume integer);
create table b (ID integer, Product_type char(1), Price float, Volume integer);

insert into a (ID, Product_type, Price, Volume) values
(1, 'X', 1, 10),
(2, 'X', 1, 11),
(3, 'Z', 2, 10)
;
insert into b (ID, Product_type, Price, Volume) values
(1, 'X', 1, 21),
(2, 'Y', 1, 5),
(3, 'Z', 2, 7),
(4, 'Z', 2, 4)
;

select 
    a.Product_type as Product_type_a,
    a.Price as Price_a,
    a.Volume as Volume_a,
    b.Product_type as Product_type_b,
    b.Price as Price_b,
    b.Volume as Volume_b
from (
        select Product_type, Price, sum(Volume) as Volume
        from a
        group by Product_type, Price
    ) a
    full outer join (
        select Product_type, Price, sum(Volume) as Volume
        from b
        group by Product_type, Price
    ) b on a.Product_type = b.Product_type and a.Price = b.Price
where 
    a.Volume != b.Volume
    or a.Volume is null or b.Volume is null
;
 product_type_a | price_a | volume_a | product_type_b | price_b | volume_b 
----------------+---------+----------+----------------+---------+----------
 Z              |       2 |       10 | Z              |       2 |       11
                |         |          | Y              |       1 |        5

答案 2 :(得分:0)

这似乎是work for me

SELECT a.Product_type, a.volume, b.Product_type, b.volume
FROM
  (SELECT Product_type, SUM(volume) AS volume
  FROM tbl1 GROUP BY Product_type) a
INNER JOIN
  (SELECT Product_type, SUM(volume) AS volume
  FROM tbl2 GROUP BY Product_type) b ON b.Product_type = a.Product_type
WHERE a.volume <> b.volume

<强>结果

| PRODUCT_TYPE | VOLUME | PRODUCT_TYPE | VOLUME |
-------------------------------------------------
|            Z |     10 |            Z |     11 |