2011-07-11 47 views
0

讓我們說我有兩個表:人(P_Id,名稱)和訂單(O_Id,OrderNo,P_Id)...我想做一個左連接這將是:SQL和Coldfusion左連接表獲取重複結果作爲一列中的列表

SELECT Persons.Name, Orders.OrderNo 
FROM Persons 
LEFT JOIN Orders 
ON Persons.P_Id=Orders.P_Id 
ORDER BY Persons.Name 

這會給我多行同一人與不同的OrderNo。我真正需要能夠得到的是每個人以及屬於該人的所有OrderNo在列表中的一行。

使用coldfusion我可以查詢Persons表,循環遍歷每條記錄,並且對於每條記錄在Orders上執行查詢並獲取該P_Id的結果並將其放入列表中並將其添加爲一個新的名爲「OrdersList」的我的第一個問題。但是我有成千上萬的記錄,這意味着要做成千上萬的查詢!必須有更好的方法來做到這一點!

回答

0

查找FOR XML - 這將讓你轉動的訂單號。

檢查了這一點

With Person AS 
(
    Select 1 PersonId, 'John' PersonName 
    Union Select 2, 'Jane' 
), 
Orders As 
(
    Select 1 OrderId, 1 PersonId, Convert (DateTime, '1/1/2011') OrderDate 
    Union Select 2, 1 , Convert (DateTime, '1/2/2011') 
    Union Select 3, 1 , Convert (DateTime, '1/5/2011') 
    Union Select 4, 1 , Convert (DateTime, '1/7/2011') 
    Union Select 5, 1 , Convert (DateTime, '1/9/2011') 
    Union Select 6, 2 , Convert (DateTime, '1/2/2011') 
    Union Select 7, 2 , Convert (DateTime, '1/5/2011') 
    Union Select 8, 2 , Convert (DateTime, '1/7/2011') 
) 
Select PersonId, 
(
    Select STUFF((SELECT ', ' + cast(O.OrderId as nvarchar) 
    FROM Orders O 
    Where 1=1 
     And O.PersonId = Person.PersonId 
    FOR XML PATH('')), 1, 1, '') 
) OrderList 
From Person 

輸出是

PersonId OrderList 
----------- ----------------------- 
1   1, 2, 3, 4, 5 
2   6, 7, 8 

(2 row(s) affected) 
+0

拉吉這是太棒了,它像一個魅力工作! – user839124

0

試試這個:

declare @tmp table(PersonName varchar(100),OrderNo bigint) 

    insert into @tmp(PersonName) 
    select Person.Name from Persons 
    where Person.Name = 'Edward' 

    insert into @tmp(OrderNo) 
    SELECT Orders.OrderNo FROM Persons 
    JOIN Orders ON Persons.P_Id=Orders.P_Id 
    where Persons.Name = 'Edward' 
+0

OP不查找特定用戶的數據,而是每個用戶有一個記錄/行。審查和避免downvotes。 –

+0

感謝Ovais,您的查詢是一樣的: SELECT ELECT Orders.OrderNo從接單 WHERE Orders.P_Id = <愛德華的p_id> 我需要得到所有的名字,但有自己的OrderNo在列表中的一個新的柱。 – user839124

0

如果您正在使用SQL Server,你可以使用FOR XML PATH

select 
    p.ID, 
    p.Name 
    stuff((select ', ' + convert(varchar, o.OrderNo) 
      from Orders o where o.P_Id = p.P_Id 
      for xml path('')), 
      1,2,'') [Orders] 
from Persons p 

STUFF功能是擺脫最終的', '將在最後附加。

您還可以在這裏看到另一個例子:

0

What I really need to be able to get is one row for each person and all the OrderNo belonging to that person in a list.

不,你不這樣做,你真的,真的不知道。


你可以做你已經做了什麼,並通過成果循環。當第一列更改值時,您知道您已轉移到新人。有一個問題可能是你一次又一次地爲每個訂單ID返回名稱。在這種情況下,返回兩個記錄集,每一個以相同的順序...

SELECT Persons.P_Id, Persons.Name 
FROM Persons 
ORDER BY Persons.Name 

SELECT Persons.P_Id, Orders.OrderNo 
FROM Persons 
INNER JOIN Orders 
ON Persons.P_Id=Orders.P_Id 
ORDER BY Persons.Name 

(你並不需要一個LEFT JOIN現在,因爲你可以通過兩個記錄推斷有沒有訂單的人,你循環套)。

+0

這就是我在我原來的問題中所說的,我可以遍歷每條記錄併爲我的數千條記錄進行查詢,但我希望有更好的方法。 :) – user839124

+0

你誤解了我的答案。您不會遍歷多個附加查詢的一組激發。你同時得到兩個集合,並且同時循環它們兩個:當P_Id改變時,它是一個新人,通過循環進入Person的記錄集可以得到的名字,直到你找到匹配P_Id。因爲您可以保證兩個記錄集的順序相同,所以這變得微不足道。 – MatBailie

相關問題