在sql中的多列不同

时间:2013-06-05 17:39:08

标签: sql

我在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

2 个答案:

答案 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 

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