Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 连接两个表时,在输出中排除重复列的T-SQL语法是什么?_Sql Server_Tsql_Join_Duplicates - Fatal编程技术网

Sql server 连接两个表时,在输出中排除重复列的T-SQL语法是什么?

Sql server 连接两个表时,在输出中排除重复列的T-SQL语法是什么?,sql-server,tsql,join,duplicates,Sql Server,Tsql,Join,Duplicates,我使用的是SQL Server 2014,我有以下连接两个表的T-SQL查询: SELECT a.*, b.* FROM TEMP a INNER JOIN Extras b ON b.ResaID = a.ResaID 我想从TEMP中提取所有列,从“Extras”中提取所有列,但ResaID列除外,因为它已经包含在上述查询中的*中。基本上,我想要拉a.*+b.*(不包括b.ResaID) 我知道我可以用以下形式编写查询: Select a.*, b.column2, b.column3,

我使用的是SQL Server 2014,我有以下连接两个表的T-SQL查询:

SELECT a.*, b.* FROM TEMP a

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

我知道我可以用以下形式编写查询:

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

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

不幸的是,没有这种语法。您可以使用星号(
*
)忽略代码中重复的列,也可以显式列出所需的列。

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

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)

您可以使用动态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+' ')

这种语法被称为“列别名”和“不要使用select
*
”,我认为如果不借助于问题答案中的建议,这是不可能的。我想你只需要在你需要的栏目中明确说明。@Moose先生谢谢你指出这个问题。我找不到了。我现在来看看答案!如果不想在select中列出所有40列,也可以创建一个视图