2

这更像是一个好奇而不是实际应用的问题。假设您有一个包含多个连接的语句,例如:

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”的列。

是否可以从包含它的所有表中选择“x”,而无需显式引用表别名。所以它会得到类似的结果(如果可能的话)

SELECT
    a.name,
    b.salary,
    *.x
...
4

2 回答 2

5

不,这是不可能的。

您可以使用a.*从其中获取所有列,a但使用通配符作为表名是无效的。

于 2013-09-17T13:56:52.470 回答
2

@Martin Smith 是正确的,您不能使用*.x和引用多个表中的列。x但是,如果一个或多个表没有这样的列,则有一种方法可以编写一个查询来显示它们存在的表中的所有列而不会中断。这是(错误)使用范围解析的一种相当复杂的方式。

假设一些表(在示例中)有一个名为 的列b,而其他一些表(这里)没有这样的列。然后,您可以将连接替换为和连接,以及将查询替换为:dxcINNERCROSS APPLYLEFTOUTER 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

于 2013-09-17T15:44:29.240 回答