繁体   English   中英

动态SQL Server 2008查询联接

[英]Dynamic SQL Server 2008 Query Join

嗨,我有下表:

CREATE TABLE #Test
        (
        ProductID int,
        MainMasterFeatureID int,
        --MasterFeatureValue Varchar(100),
        ChilFeatureName varchar(100),
        ParentFeatureName varchar(100)
    )

    INSERT INTO #Test
    SELECT 40,1,,'Pack','Type' 
    UNION ALL 
    SELECT 40,0,'Laminate','Technology'
    UNION ALL
    SELECT 40,11,'Yes','Coated'
    UNION ALL
    SELECT 52,1,'Roll','Type'
    UNION ALL
    SELECT 52,11,'NO','Coated'




    SELECT * FROM #Test


 CREATE TABLE #tProduct
    (
        tProductID int PRIMARY KEY, 
        tProductCode nvarchar(128), 
        tProductName nvarchar(256)
    )
INSERT INTO #tProduct
SELECT 40,'001','ABC'
UNION ALL
SELECT 52,'002','XYZ'
UNION ALL
SELECT 50,'006','IJK' 

我想From #test table生成如下结果:

 ProductID          Type             Technology      Coated 

   40               Pack              Laminate          YES 

   52               Roll               Null              No

此处类型,技术,涂层不固定,可以动态生成。

它可以这样生成...

Declare @sql Varchar(MAX) 
Select @sql  = 'SELECT ProductID, ' 
Select @sql = @sql + STUFF((Select DISTINCT ',MAX(Case When ParentFeatureName = ' + CHAR(39) + ParentFeatureName + CHAR(39) + ' Then ChilFeatureName Else ' + CHAR(39) + CHAR(39) + ' End) As ' + ParentFeatureName From #Test For XML PATH('')),1,1,'') 
Select @sql = @sql + ' FROM #Test Group By ProductID' 
Execute(@sql)

现在,我想将此动态查询加入#tProduct以获得所需的结果:

 tProductID   tProductName        Type             Technology      Coated 

   40            ABC              Pack              Laminate          YES 

   52            XYZ              Roll               Null              No  

您可以使用动态数据透视表并在动态查询中加入#tProduct来实现此#tProduct

declare @SQL nvarchar(max)
declare @FieldList nvarchar(max)

set @FieldList = 
  (
  select distinct ','+quotename(ParentFeatureName)
  from #Test
  for xml path(''), type
  ).value('substring(text()[1], 2)', 'nvarchar(max)')

set @SQL = 
'
select TP.tProductID,
       TP.tProductName,'+
       @FieldList+'
from 
  (
  select ProductID, 
         ParentFeatureName,
         ChilFeatureName
  from #Test
  ) as T
pivot
  (
    max(T.ChilFeatureName) 
    for T.ParentFeatureName in ('+@FieldList+')
  ) as P
inner join #tProduct as TP
  on P.ProductID = TP.tProductID'

exec(@SQL)

SQL小提琴

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM