在SQL中连接表行和表列

时间:2015-04-20 07:52:27

标签: sql-server sql-server-2008-r2 sql-server-2012

我有一个名为Tbl的表,n列数nrows

Create Table Tbl(Col1, Col2, Col3,...)

我有另一个名为TblColNms的表,我在其中维护列名。

Create Table TblColNms(ColId, ColNms)

TblColNms中,我插入表格“Tbl”的列名。例如:

Insert into TblColNms(1, Col1)
Insert into TblColNms(2, Col2)    

我的要求是:

仅检索TblColNms中插入的列 例如:

Select (Select ColNms 
        from TblColNms) 
from Tbl

哪个应返回Tbl的所有行,但只返回2个列名。

4 个答案:

答案 0 :(得分:2)

这看起来像是以堆栈的形式存储数据。您可以使用PIVOT和动态查询来实现此目的。

DECLARE @DynamicPivotQuery AS NVARCHAR(MAX)
DECLARE @ColumnName AS NVARCHAR(MAX)

--Get distinct values of the PIVOT Column 
SELECT @ColumnName= ISNULL(@ColumnName + ',','') 
       + QUOTENAME(Course)
FROM (SELECT DISTINCT Course FROM #CourseSales) AS Courses

--Prepare the PIVOT query using the dynamic 
SET @DynamicPivotQuery = 
  N'SELECT Year, ' + @ColumnName + '
    FROM #CourseSales
    PIVOT(SUM(Earning) 
          FOR Course IN (' + @ColumnName + ')) AS PVTTable'
--Execute the Dynamic Pivot Query
EXEC sp_executesql @DynamicPivotQuery

原作者:http://sqlhints.com/2014/03/18/dynamic-pivot-in-sql-server/

答案 1 :(得分:0)

可能是这样的:

DECLARE @TABLE_NAME NVARCHAR(MAX)
DECLARE @CMD NVARCHAR(MAX)
SET @TABLE_NAME = 'dbo.Table1'
SET @CMD = 'SELECT '

SELECT @CMD = @CMD + ',' + ColNms
FROM TblColNms

--eliminate leading comma
SET @CMD = REPLACE(@CMD,' ,',' ') + ' FROM ' + @TABLE_NAME

PRINT @CMD
EXEC sp_executesql @CMD

答案 2 :(得分:0)

您可以使用FOR XML PATH('')让SQL Server将一系列行值转换为逗号分隔列表,如下所示:

SELECT ',' + colName from ColumnNames for XML path('')

这会提供类似,first_column,another_column,last_column

的内容

如果在声明中执行此操作,则可以执行结果语句,就像使用sp_executesql在javascript中使用eval()一样

我在这里使用STUFF来删除第一个逗号

DECLARE @SQLQuery NVARCHAR(MAX) = 'SELECT ' 
           + STUFF((
                SELECT ',' + colName from ColumnNames for XML path('')
             ), 1, 1, '') + ' FROM Product';
EXEC sp_executesql @SQLQuery

答案 3 :(得分:0)

据我所知,你需要一些存储在表中的特殊列名的行集结果:

  1. 您需要一个可以静态提供结果的存储过程,如下所示:
  2. CREATE PROCEDURE SP1 AS
    BEGIN
        SET NOCOUNT ON;
        DECLARE @query as nvarchar(max) = 'SELECT '
        SELECT @query = @query + ColNms + ','
        FROM TblColNms
    
        SET @query = LEFT(@query, LEN(@query) - 1 ) + ' FROM Tbl'
        EXEC(@query)
    END
    GO
    

    你将通过这样执行你的结果:

    EXEC SP1
    
    1. 制作一个类似Temp1的表格,然后像这样查询:
    2. CREATE PROCEDURE SP2 AS
      BEGIN
          IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Temp1]') AND type in (N'U'))
              DROP TABLE [dbo].[Temp1]
      
          DECLARE @query as nvarchar(max) = 'SELECT '
      
          SELECT @query = @query + ColNms + ','
          FROM TblColNms
      
          SET @query = LEFT(@query, LEN(@query) - 1 ) + ' INTO dbo.Temp1 FROM Tbl'
          EXEC(@query)
      END
      

      当你想要你的结果时,请使用它:

      EXEC SP2
      
      SELECT * FROM Temp1
      

      这种方式可以为您的结果提供更多选项,例如:

      SELECT Top(<n>) * 
      FROM Temp1 
      WHERE <condition>