2012-05-17 142 views
1
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

回答

1

要回答你的問題,雖然有強烈的情況下使用不同的解決方案;如果您使用的是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

1

首先,這裏有個不確定性。如果有兩個Teds,你希望發生什麼?

儘管SQL可能會根據您正在運行的服務器而有所不同,但最有可能的方法是使用SQL。不過,我強烈反對。你可以用一個單一的連接(假設你已經正確設置了索引)將一個簡單而有效的查詢變成過於複雜的事情。

你的願望應該在顯示器/消費者方面真正做到。毫無疑問,你會得到一個解決方案,但我會採用標準連接。我還會將客戶ID添加到輸出以避免上述含糊不清。

+0

採取點,謝謝所有。 – Rod