我有两张桌子
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
我一直在研究它几个小时,但我没有得到预期的结果。
答案 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
条记录