T-SQL:Wild Card作为select语句中的表名别名可能吗?

时间:2013-09-17 13:51:13

标签: sql sql-server tsql

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

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
...

2 个答案:

答案 0 :(得分:5)

不,这是不可能的。

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

答案 1 :(得分:2)

@Martin Smith是正确的,你不能使用*.x并引用多个表中的列。但是,有一种方法可以编写一个查询,从查询表中显示所有列x,而不会破坏一个或多个表是否没有这样的列。 (误)使用范围分辨率是一种相当复杂的方式。

让我们说某些表(示例中为bd)有一个名为x的列,而其他一些(此处为c)则没有这样的专栏。然后,您可以将INNER加入CROSS APPLYLEFT联接替换为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