假设:
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'.
现在这是一个大型查询,t1
和t2
有很多(+200)列。我不是要列出所有内容:我明确要使用*
。
通常我会用USING (id)
子句解决这个问题,但SQL Server似乎并不支持这一点。有什么想法吗?
其他选项是在没有WITH
子句的情况下工作 - 工作但使代码的可读性降低。
SO上有许多答案可以列出所有字段。在WITH子句和纯SQL中,这是一个明确的问题。相关问题,如"排除字段" here和here以及一个for views要求提供非ANSI SQL功能。此问题针对纯SQL,如果SQL Server支持ANSI SQL-92语法,则可能(据我所知)。
答案 0 :(得分:2)
问题不在ON
子句中。它位于SELECT
。使用*
选择t1.id
和t2.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。