Sql server 连接两个表时,在输出中排除重复列的T-SQL语法是什么?
我使用的是SQL Server 2014,我有以下连接两个表的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,
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列,也可以创建一个视图