Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql查询don';不显示重复记录_Sql_Sql Server - Fatal编程技术网

sql查询don';不显示重复记录

sql查询don';不显示重复记录,sql,sql-server,Sql,Sql Server,基本上,我不想重复客户的名字,如果她有一个以上的产品。有办法做到这一点吗 解决方案: 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 ---------------------- T

基本上,我不想重复客户的名字,如果她有一个以上的产品。有办法做到这一点吗

解决方案:

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

首先,这里有一个模糊性。如果有两个TED,你预计会发生什么

使用SQL很可能有一种方法可以做到这一点,尽管它可能因您运行的服务器而异。不过,我强烈反对。您可能会将一个简单而高效的单连接查询(假设索引设置正确)变成过于复杂的查询


您的愿望应该真正在显示器/消费者方面实现。毫无疑问,您将得到一个解决方案,但我将使用标准联接。我还将把客户id添加到输出中,以避免前面提到的歧义。

回答您的问题,尽管有充分的理由使用不同的解决方案;如果您使用的是sql server,请查看“row_number()”。我不使用SQL Server,但它可能看起来像这样:

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

您肯定应该在显示层而不是数据库上执行此操作level@Lamak:但是如果返回一个要在SQL Reporting Services报告中使用的结果集,您可能会想这样做。我说的是使用游标,但我觉得太懒了,无法想出一个使用cursor@Sung-Reporting Services可以很好地处理这样的数据(这就是tablix存在的原因),并且可以以多种不同的方式显示,而无需重复名称。我还想知道为什么Customers表具有orderid。通常情况下,Orders表具有customerid。这将允许客户下多个订单。这不符合TSQL,但我希望TSQL中允许使用此类语法。您只需r向我介绍row_number函数(即使在这种情况下不应该使用)。使sql提供一个子选择并将if(cond,true,false)CASE语句放置在容器sql中,从而使其工作。@rod-您应该在编辑问题时显示您的解决方案。
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