在SELECT *中只使用一次连接列

时间:2018-04-05 07:38:18

标签: sql sql-server

假设:

WITH t12 AS (SELECT * FROM t1 INNER JOIN t2 ON (t1.id = t2.id))
SELECT * FROM t12

这将失败:

The column 'id' was specified multiple times for 't12'.

现在这是一个大型查询,t1t2有很多(+200)列。我不是要列出所有内容:我明确要使用*

通常我会用USING (id)子句解决这个问题,但SQL Server似乎并不支持这一点。有什么想法吗?

其他选项是在没有WITH子句的情况下工作 - 工作但使代码的可读性降低。

SO上有许多答案可以列出所有字段。在WITH子句和纯SQL中,这是一个明确的问题。相关问题,如"排除字段" herehere以及一个for views要求提供非ANSI SQL功能。此问题针对纯SQL,如果SQL Server支持ANSI SQL-92语法,则可能(据我所知)。

2 个答案:

答案 0 :(得分:2)

问题不在ON子句中。它位于SELECT。使用*选择t1.idt2.id。这两个名字相同,因此你会得到错误。

我能看到的唯一解决方法是将*应用于具有最大列数的表,并明确命名要选择的另一个表的列:

WITH t12 AS (
   SELECT t1.*, t2.myColumn, etc...  
   FROM t1 
   INNER JOIN t2 ON (t1.id = t2.id)
)
SELECT * FROM t12

答案 1 :(得分:1)

您不能使用具有2个或更多列具有完全相同名称的子查询(CTE或常规子查询)。遗憾的是没有解决方法。您唯一的选择是在您选择它们​​时显式更改重复列别名,无论是手动还是动态SQL。