sql查询不显示重复记录

问题描述:

Customers 
id,name,orderid 
---------------------- 
1,Ted, 1 
2,Jen, 2 

Orders 
id,prodname 
---------------------- 
1,widgetA 
1,widgetC 
2,widgetB 
2,widgetA 


desired results 
name, prodname 
---------------------- 
Ted, widgetA 
' ', widgetC 
Jen, widgetB 
' ', widgetA 

基本上我不想重复客户的名字,如果她有多个产品。有没有办法做到这一点?sql查询不显示重复记录

解决方案:

Select 
    (CASE WHEN myrow=1 THEN Name ELSE ' ' END) AS Name, 
    product 
From 
(
    Select 
     ROW_NUMBER() OVER (PARTITION BY c.Name ORDER BY c.Name) AS myrow,  
     o.productname AS product 
    FROM 
     Customers c JOIN 
     Orders o ON c.orderid = o.id 
) T1 

Order By Name 
+4

你一定要做到这一点,显示层上不上的数据库级别 – Lamak

+1

@Lamak:但你可能想这样做,如果你正在返回在SQL Reporting Services报告中使用的结果集 – Sung

+1

我说使用游标,但我觉得懒得想出一个使用游标的解决方案 – Sung

要回答你的问题,虽然有强烈的情况下使用不同的解决方案;如果您使用的是sql server,请查看“row_number()”。我没有使用SQL Server,但它可能是这个样子:

Select 
    ROW_NUMBER() OVER (ORDER BY c.Name) AS myrow, 
    if(myrow=1,name,' ') AS name, 
    o.productname AS product 
FROM 
    Customers c JOIN 
    Orders o ON c.orderid = o.id 
+0

这不是TSQL兼容,但我希望这种语法可以在TSQL中允许。 – Sung

+0

为了向我介绍row_number函数(即使不应该在这种情况下使用),您得到了一个投票。 – Limey

+0

通过让sql提供了一个子选择并将if(cond,true,false)CASE语句放在容器sql中来实现它。 – Rod

首先,这里有个不确定性。如果有两个Teds,你希望发生什么?

尽管SQL可能会根据您正在运行的服务器而有所不同,但最有可能的方法是使用SQL。不过,我强烈反对。你可以用一个单一的连接(假设你已经正确设置了索引)将一个简单而有效的查询变成过于复杂的事情。

你的愿望应该在显示器/消费者方面真正做到。毫无疑问,你会得到一个解决方案,但我会采用标准连接。我还会将客户ID添加到输出以避免上述含糊不清。

+0

采取点,谢谢所有。 – Rod