如何 select 数据与数据库的连接而不重复
How to select data with joins from database without duplication
我确实有 returning 正确数据的查询,但我想将其修改为 return 仅来自左侧 tables.
的唯一值
SELECT * FROM XUSER u
LEFT JOIN USER_PRODUCT up ON u.id = up.user_id
LEFT JOIN PRODUCT p ON up.product_id = p.id
WHERE p.id IN (1,2,3...18);
所以你可能怀疑 id=1
的用户是否与产品有多重关系我会多次显示这个用户。
我真的可以使用 DISTINCT
,因为我需要来自产品 table 的一些数据,但单一结果就可以了。例如,如果用户与称为书籍和电影的产品有关系,我可以只显示与文本 BOOK 的第一个关系。
order by
也是如此。
看来你只需要一个 ROW_NUMBER() 解析函数 -
SELECT * FROM XUSER u
LEFT JOIN USER_PRODUCT up ON u.id = up.user_id
LEFT JOIN (SELECT id, <other required columns>,
ROW_NUMBER() OVER(PARTITION BY id) RN
FROM PRODUCT) p ON up.product_id = p.id
AND RN = 1
WHERE p.id IN (1,2,3...18);
有一种方法可以简化它。我还会在 USER_PRODUCT table 中索引 product_id。我也想知道你在哪里有重复的条目?他们在 USER_PRODUCT 或 PRODUCT table 中吗?
SELECT *
FROM XUSER u
JOIN
(
SELECT user_id, product_id
FROM USER_PRODUCT up
GROUP BY user_id, product_id
) gp
ON gp.user_id = u.id
JOIN PRODUCT p
ON p.id = gp.product_id
WHERE p.id IN ( 1, 2, 3, 18 );
我确实有 returning 正确数据的查询,但我想将其修改为 return 仅来自左侧 tables.
的唯一值SELECT * FROM XUSER u
LEFT JOIN USER_PRODUCT up ON u.id = up.user_id
LEFT JOIN PRODUCT p ON up.product_id = p.id
WHERE p.id IN (1,2,3...18);
所以你可能怀疑 id=1
的用户是否与产品有多重关系我会多次显示这个用户。
我真的可以使用 DISTINCT
,因为我需要来自产品 table 的一些数据,但单一结果就可以了。例如,如果用户与称为书籍和电影的产品有关系,我可以只显示与文本 BOOK 的第一个关系。
order by
也是如此。
看来你只需要一个 ROW_NUMBER() 解析函数 -
SELECT * FROM XUSER u
LEFT JOIN USER_PRODUCT up ON u.id = up.user_id
LEFT JOIN (SELECT id, <other required columns>,
ROW_NUMBER() OVER(PARTITION BY id) RN
FROM PRODUCT) p ON up.product_id = p.id
AND RN = 1
WHERE p.id IN (1,2,3...18);
有一种方法可以简化它。我还会在 USER_PRODUCT table 中索引 product_id。我也想知道你在哪里有重复的条目?他们在 USER_PRODUCT 或 PRODUCT table 中吗?
SELECT *
FROM XUSER u
JOIN
(
SELECT user_id, product_id
FROM USER_PRODUCT up
GROUP BY user_id, product_id
) gp
ON gp.user_id = u.id
JOIN PRODUCT p
ON p.id = gp.product_id
WHERE p.id IN ( 1, 2, 3, 18 );