0

我在 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 的行(重复)

有任何想法吗

谢谢

巴罗兹

4

2 回答 2

2

按照你在输出中的期望和你的评论说“......如果输出中的行包含相同的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)
于 2013-06-05T17:53:57.830 回答
0

如果您希望删除所有列重复的行,只需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 

如果这仍然不是您想要的,您需要向我们提供数据并更好地指定您想要什么。

于 2013-06-05T17:45:42.700 回答