2010-11-11 72 views
0

我有一個SQL存儲過程將只返回一條記錄。但是,在該proc中,是一個子查詢,它可以返回多個行。我相信這可能是最好的設計子查詢返回一列多列,而不是多行。顯示結果集列作爲列

如何寫出子查詢,以便它返回列。
目前查詢是:

SET @Pkg_Status = (Select lf.name, edi.Date from EdiPackage edi, Labelfeed lf 
    Where edi.orderID = @OrderID 
    AND edi.code = lf.code 
    AND lf.labelID = 'EDIStage') 

從上述查詢的樣本結果集是:

 
Column 1    Column 2 
Field1.Value1  Field2.Value1 
Field1.Value2  Field2.Value2 
Field1.Value3  Field2.Value3 

相反,我想結果是:

 
Column 1  | Column2  | Column3  | Column4  | Column 5  | Column 6 
Field1.Value1 | Field2.Value1 | Field1.Value2 | Field2.Value2 | Field1.Value3 | Field2.Value3 

如何這樣做?

+0

我不確定任何人都明白這個問題。你能向我們展示一些樣本數據和期望的輸出嗎? – Thomas 2010-11-11 19:08:33

+1

看看SQL Server 2000中的旋轉表。搜索stackoverflow ...我回答了類似的問題 – 2010-11-11 21:57:14

回答

4

首先,你應該使用連接兩個表時,而不是分離通過逗號的表的ISO加入關鍵字,然後「加盟」他們在Where子句中。所以我們的查詢將是:

Select LF.name, EDI.Date 
From EdiPackage As EDI 
    Join LabelFeed As LF 
     On LF.Code = EDI.Code 
Where EDI.orderID = @OrderID 
    And LF.labelID = 'EDIStage' 

其次,您的原始示例是將查詢的結果設置爲變量。這不適用於多列或多行。最好的情況是,SQL可能會簡單地將子查詢中的第一列。最後,它聽起來就像是一個交叉表。我們需要看到的數據,但是你可以通過做一些像這樣實現你想要的:

Select Min(Case When LF.Name = 'Value1' Then LF.Name End) As Col1 
    , Min(Case When LF.Name = 'Value1' Then EDI.Date End) As Col2 
    , Min(Case When LF.Name = 'Value2' Then LF.Name End) As Col3 
    , Min(Case When LF.Name = 'Value2' Then EDI.Date End) As Col4 
    , Min(Case When LF.Name = 'Value3' Then LF.Name End) As Col5 
    , Min(Case When LF.Name = 'Value3' Then EDI.Date End) As Col6 
From EdiPackage As EDI 
    Join LabelFeed As LF 
     On LF.Code = EDI.Code 
Where EDI.orderID = @OrderID 
    And LF.labelID = 'EDIStage' 

在這種情況下,您將要替換「值1」,「值」和「值3」的數據值應該用來區分一列和另一列。

0

您應該編寫一個存儲過程,該存儲過程將創建一個可以動態添加列的新內存表,並且每列將具有不同的行。

0

在SQL 2005及更高版本中,您將使用數據透視表。

如果列數是固定的,請使用Thomas給出的答案。

否則,他們擠進一個領域,你會做這樣的事情

Declare @Pkg_Status Character Varying(8000) 
Select @Pkg_Status = 
    Coalesce(@Pkg_Status + ',' + LF.Name + ',' + Cast(EDI.Date As Character Varying), 
      LF.Name + ',' + Cast(EDI.Date As Character Varying)) 
From 
    dbo.EDIPackage As EDI 
    Inner Join dbo.LabelFeed As LF 
    On EDI.Code = LF.Code 
Where 
    (EDI.OrderID = @OrderID) 
    And (LF.LabelID = 'EDIStage') 
+0

那麼,主存儲過程返回一個XML結果集到一個Web服務。因此需要返回一條記錄。我的環境仍然在SQL 2000中。 – user279521 2010-11-11 19:17:51

+0

然後,您可能最好將值合併到單個列中(使用適當的分隔符)。 – Stu 2010-11-11 20:00:39

+0

你能提供一個代碼示例嗎? – user279521 2010-11-11 20:07:15