我在 sql 中有这个查询
select cartlines.id,cartlines.pageId,cartlines.quantity,cartlines.price
from orders
INNER JOIN
cartlines on(cartlines.orderId=orders.id)where userId=5
我想通过 pageid 获得不同的行,所以最后我不会再有一次具有相同 pageid 的行(重复)
有任何想法吗
谢谢
巴罗兹
我在 sql 中有这个查询
select cartlines.id,cartlines.pageId,cartlines.quantity,cartlines.price
from orders
INNER JOIN
cartlines on(cartlines.orderId=orders.id)where userId=5
我想通过 pageid 获得不同的行,所以最后我不会再有一次具有相同 pageid 的行(重复)
有任何想法吗
谢谢
巴罗兹
按照你在输出中的期望和你的评论说“......如果输出中的行包含相同的pageid,只会显示一个......”听起来你正在尝试获得最高记录对于每个页面 ID。这可以通过ROW_NUMBER()
和来实现PARTITION BY
:
SELECT *
FROM (
SELECT
ROW_NUMBER() OVER(PARTITION BY c.pageId ORDER BY c.pageID) rowNumber,
c.id,
c.pageId,
c.quantity,
c.price
FROM orders o
INNER JOIN cartlines c ON c.orderId = o.id
WHERE userId = 5
) a
WHERE a.rowNumber = 1
您也可以ROW_NUMBER() OVER(PARTITION BY ...
与 with 一起使用TOP 1 WITH TIES
,但运行速度会慢一些(尽管更干净):
SELECT TOP 1 WITH TIES c.id, c.pageId, c.quantity, c.price
FROM orders o
INNER JOIN cartlines c ON c.orderId = o.id
WHERE userId = 5
ORDER BY ROW_NUMBER() OVER(PARTITION BY c.pageId ORDER BY c.pageID)
如果您希望删除所有列重复的行,只需distinct
在查询中添加 a 即可解决。
select distinct cartlines.id,cartlines.pageId,cartlines.quantity,cartlines.price
from orders
INNER JOIN
cartlines on(cartlines.orderId=orders.id)where userId=5
但是,如果这没有区别,则意味着其他列具有不同的值,因此列值的组合会创建不同(唯一)的行。
正如 Michael Berkowski 在评论中所说:
DISTINCT
- 确实对 SELECT 列表中的所有列进行操作,因此我们需要更好地了解您的特殊情况。
如果简单地添加 distinct 并不能覆盖您,您还需要删除逐行不同的列,或者使用聚合函数来获取每个购物车的聚合值。
示例 - 每个不同 pageId 的总数量:
select distinct cartlines.id,cartlines.pageId, sum(cartlines.quantity)
from orders
INNER JOIN
cartlines on(cartlines.orderId=orders.id)where userId=5
如果这仍然不是您想要的,您需要向我们提供数据并更好地指定您想要什么。