2010-11-11 37 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