【问题标题】:What is the T-SQL syntax to exclude a duplicate column in the output when joining 2 tables?连接 2 个表时在输出中排除重复列的 T-SQL 语法是什么?
【发布时间】:2016-06-22 01:32:29
【问题描述】:

我正在使用 SQL Server 2014,并且我有以下连接 2 个表的 T-SQL 查询:

SELECT a.*, b.* FROM TEMP a

INNER JOIN Extras b ON b.ResaID = a.ResaID

我想从 TEMP 中提取所有列,并从“Extras”中提取所有列,但 ResaID 列除外,因为它已包含在上述查询的 a.* 中。基本上,我想拉a.* + b.*(不包括b.ResaID)。

我知道我可以将查询写成如下形式:

Select a.*, b.column2, b.column3,... 

但由于 b.* 有大约 40 列,有没有办法以更简化的方式编写查询以排除 b.ResaID,而不是指定“Extras”表中的每一列?

【问题讨论】:

  • 这种语法叫做“列别名”和“不要使用选择*
  • 如果不求助于this question 的答案中提出的想法,我认为这是不可能的。我认为您只需要明确说明您需要哪些列。
  • @MrMoose 感谢您指出这个问题。我在搜索中错过了它。我现在来看看答案!
  • 你也可以创建一个视图,如果你不想在 select 中列出所有 40 列

标签: sql-server tsql join duplicates


【解决方案1】:

不幸的是,没有这样的语法。您可以使用星号 (*) 并忽略代码中的重复列,或者明确列出您需要的列。

【讨论】:

    【解决方案2】:

    您应该创建一个视图并从该视图中选择您需要的列。这是一个将为您生成该视图的脚本:

    DECLARE @table1 nvarchar(20) = 'temp'
    DECLARE @table1key nvarchar(20) = 'ResaID'
    
    DECLARE @table2 nvarchar(20) = 'Extras'
    DECLARE @table2key nvarchar(20) = 'ResaID'
    
    DECLARE @viewname varchar(20) = 'v_myview'
    
    DECLARE @sql varchar(max) = ''
    SELECT @sql += '], a.[' + column_name
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_NAME = @table1
    
    SELECT @sql += '], b.[' + column_name
    FROM
    (
      SELECT column_name
      FROM INFORMATION_SCHEMA.COLUMNS
      WHERE TABLE_NAME = @table2
      EXCEPT
      SELECT column_name
      FROM INFORMATION_SCHEMA.COLUMNS
      WHERE TABLE_NAME = @table1
    ) x
    
    SELECT 
      @sql = 'CREATE view ' +@viewname+ ' as SELECT ' 
      + STUFF(@sql, 1, 3, '') + '] FROM [' 
      +@table1+ '] a JOIN ['+ @table2 
      +'] b ON ' + 'a.' + @table1key + '=b.' + @table2key
    
    
    EXEC(@sql)
    

    【讨论】:

      【解决方案3】:

      您可以使用动态 sql 查询简单地解决此问题。

      DECLARE @V_SQL   AS NVARCHAR(2000)='' --variable to store dynamic query
              ,@V_TAB1 AS NVARCHAR(200)='TEMP' --First Table
              ,@V_TAB2 AS NVARCHAR(200)='Extras' --Second Table
              ,@V_CONDITION AS NVARCHAR(2000)='A.ResaID = B.ResaID' --Conditions
      SELECT  @V_SQL  =   STUFF(
          (   SELECT ', '+TCOL_NAME
              FROM
              (   SELECT 'A.'+S.NAME AS TCOL_NAME 
                  FROM SYSCOLUMNS AS S 
                  WHERE OBJECT_NAME(ID) = @V_TAB1
                  UNION ALL
                  SELECT 'B.'+S.NAME 
                  FROM SYSCOLUMNS AS S 
                  WHERE   OBJECT_NAME(ID) = @V_TAB2
                      AND S.NAME NOT IN (SELECT S.NAME 
                                         FROM SYSCOLUMNS AS S 
                                         WHERE OBJECT_NAME(ID) = @V_TAB1)
              )   D
              FOR XML PATH('')
          ),1,2,'')
      EXECUTE ('SELECT '+@V_SQL+' 
                   FROM '+@V_TAB1+' AS A 
                   INNER JOIN '+@V_TAB2+' AS B ON '+@V_CONDITION+' ')
      

      【讨论】:

        猜你喜欢
        • 2015-09-03
        • 1970-01-01
        • 2010-09-12
        • 2017-06-15
        • 1970-01-01
        • 2022-12-04
        • 2021-04-19
        • 2020-09-18
        • 1970-01-01
        相关资源
        最近更新 更多