Sql两个表组合且仅区分特定值

时间:2016-06-16 15:47:09

标签: mysql sql select

我有两张桌子

products
--------
product_id
1
2
3
4
5
6
7
8
product_to_group
----------------
product_id | product_group_id
1            10
2            10
3            10
4            20
5            20
SELECT p.product_id, p2g.product_group_id 
FROM products p 
LEFT JOIN product_to_group p2g ON (p.product_id = p2g.product_id)

结果是

product_id | product_group_id
1            10
2            10
3            10
4            20
5            20
6            NULL
7            NULL
8            NULL

问题出在这里,我想要 - 选择product_group_id值为NULL的所有行 - 选择product_group_id列具有相同值的行中的一行 -product_id不重要。它本身就可以是任何一种。

我想要这个结果

product id | product_group_id
1            10
4            20
6            NULL
7            NULL
8            NULL

我一直在研究它几个小时,但我没有得到预期的结果。

2 个答案:

答案 0 :(得分:1)

大多数SQL引擎都支持ANSI标准窗口函数。您可以使用SELECT product_id, product_group_id FROM (SELECT p.product_id, p2g.product_group_id, ROW_NUMBER() OVER (PARTITION BY p2g.product_group_id ORDER BY p2g.product_group_id) as seqnum FROM products p LEFT JOIN product_to_group p2g ON p.product_id = p2g.product_id ) pg WHERE product_group_id IS NULL or seqnum = 1

{{1}}

答案 1 :(得分:1)

您可以使用UNION

SELECT MIN(p.product_id), pg.product_group_id
FROM products AS p
LEFT JOIN product_to_group AS pg ON p.product_id = pg.product_id
WHERE pg.product_id IS NOT NULL
GROUP BY pg.product_group_id

UNION ALL

SELECT p.product_id, pg.product_group_id
FROM products AS p
LEFT JOIN product_to_group AS pg ON p.product_id = pg.product_id
WHERE pg.product_id IS NULL

UNION的第一部分使用分组以返回唯一的product_group_id值,而第二部分则返回与product记录无关的所有product_to_group条记录