2013-07-30 82 views
2

列的值賦給我試圖做的SQL Server以下內容:子查詢的SQL

SELECT 
    PRODUCER_NAME, PRODUCER_ID, 
    (SELECT @X = @X + PRODUCT_NAME 
    FROM PRODUCT 
    WHERE PRODUCER_ID = PRODUCER.ID) 
FROM 
    PRODUCER 

有兩個表。 Producer表是所有生產者的列表。 Product表存儲生產者生產的產品。 @xvarchar變量

基本上我想要一個所有產品的列表,由生產者用逗號分隔。

例如

Producer  Products 
--------  -------------------------- 
P1   ProductA,ProductB,ProductC 
P2   ProductD,ProductE 

我不知道這是可能的這種方式。有誰知道如何在不連接表格的情況下做到這一點?

+0

如果您返回多個行,您的varchar變量如何包含多個逗號分隔列表? –

+0

這就是我困惑的地方,所以我問了這樣的問題...... – iosDeveloper

+0

您能否滿足@羅曼並告訴我們PRODUCER_ID或ID中的密鑰?我曾試着向他解釋這是絕對不相關的,因爲這些並不是你真正的表名,但他對此持懷疑態度。 –

回答

7

我沒有辦法讓您將多個輸出逗號分隔的列表分配給單個varchar變量,但也許您實際上並不需要這樣做。試試這個:

SELECT 
    Producer = p.PRODUCER_NAME, 
    Products = STUFF((
    SELECT ',' + pr.PRODUCT_NAME 
     FROM dbo.PRODUCT AS pr 
     WHERE pr.PRODUCER_ID = p.PRODUCER_ID 
     FOR XML PATH('')).value('.[1]','nvarchar(max)'),1,1,'') 
FROM dbo.PRODUCER AS p; 
+0

Aaron我試過你的代碼,它工作得很好,但需要時間來獲取結果。這是因爲索引嗎? – iosDeveloper

+0

@Jignesh是的,它可能是。 「PRODUCT.PRODUCER_ID」上有索引嗎?我們在這裏討論了多少行? 「時間」有多長? –

+0

不知道誰低估了這一點,但是...哦。沒關係。我會認爲這是報復 – swasheck

1

如果你想連接的名稱,你可以這樣做:

select 
    P.PRODUCER_NAME, P.PRODUCER_ID, 
    stuff(
     (
      select ',' + T.PRODUCT_NAME 
      from PRODUCT as T 
      where T.PRODUCER_ID = P.PRODUCER_ID 
      for xml path(''), type 
     ).value('.', 'nvarchar(max)') 
    , 1, 1, '') as PRODUCT_NAMES 
from PRODUCER as P 

有兩點需要注意:

  1. 始終使用表的別名對於這樣的疑問。查看原因 - 從查詢中刪除別名,並從PRODUCT表中刪除PRODuCER_ID。
  2. 使用value方法代替隱式轉換爲nvarchar,以正確使用名稱'Product & 1'。
+0

爲什麼downvote? –

+0

感謝您的解決方案和筆記!這些工作很棒!順便說一句,在我的問題中,表名和列名都是不真實的。 – iosDeveloper

+1

是的,我知道,唯一的一點是警告人們使用別名 –