我在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的行多一次(重复)
任何想法
由于
Baaroz
答案 0 :(得分: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 ...
和TOP 1 WITH TIES
,但运行速度稍慢(尽管WAY更干净):
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)
答案 1 :(得分:0)
如果您希望删除所有列重复的行,只需在查询中添加distinct
即可解决此问题。
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
如果这仍然不是您想要的,您需要向我们提供数据并更好地指定您想要的内容。