这更像是一个好奇而不是实际应用的问题。假设您有一个包含多个连接的语句,例如:
SELECT
a.name,
b.salary,
c.x
FROM
[table1] a
INNER JOIN [table2] b
ON a.key = b.key
INNER JOIN [table3] c
ON b.key = c.key
现在,假设您要对其模式不熟悉的其他表进行多次连接,但是您知道:
是否可以从包含它的所有表中选择“x”,而无需明确引用表别名。所以它会产生类似的结果(如果可能的话)
SELECT
a.name,
b.salary,
*.x
...
答案 0 :(得分:5)
不,这是不可能的。
您可以使用a.*
从a
获取所有列,但使用通配符作为表名无效。
答案 1 :(得分:2)
@Martin Smith是正确的,你不能使用*.x
并引用多个表中的列。但是,有一种方法可以编写一个查询,从查询表中显示所有列x
,而不会破坏一个或多个表是否没有这样的列。 (误)使用范围分辨率是一种相当复杂的方式。
让我们说某些表(示例中为b
和d
)有一个名为x
的列,而其他一些(此处为c
)则没有这样的专栏。然后,您可以将INNER
加入CROSS APPLY
和LEFT
联接替换为OUTER APPLY
,将查询替换为:
SELECT
a.name,
a.salary,
b.x AS bx,
'WITHOUT column x' AS cx,
d.x AS dx
FROM
a
INNER JOIN b
ON a.aid = b.aid
LEFT JOIN c
ON a.aid = c.aid
LEFT JOIN d
ON a.aid = d.aid ;
将写成:
SELECT
a.name,
a.salary,
bx,
cx,
dx
FROM
( SELECT a.*,
'WITHOUT column x' AS x
FROM a
) a
CROSS APPLY
( SELECT x AS bx
FROM b
WHERE a.aid = b.aid
) b
OUTER APPLY
( SELECT x AS cx
FROM c
WHERE a.aid = c.aid
) c
OUTER APPLY
( SELECT x AS dx
FROM d
WHERE a.aid = d.aid
) d ;
在SQL-Server 2008上测试: SQL-Fiddle