【问题标题】:T-SQL: Wild Card as table name alias in select statement possible?T-SQL:通配符作为选择语句中的表名别名可能吗?
【发布时间】:2013-09-17 13:51:13
【问题描述】:

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

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

【问题讨论】:

  • 像数据库开发人员一样思考。假设我们允许,包括所有表格。然后我们返回 5 列,都称为 x,你怎么知道哪个是哪个?
  • 我试图找出是否可以在多个连接表中选择多个具有相同名称的列,而无需在 select 语句中显式地为表名(或别名)添加前缀。 @Penguat 我认为这是不好的做法,但对它的可能性感到好奇。
  • 您可以从sys.columns 中提取所有表/列,然后相应地构建您的sql。
  • @penguat - 但无论如何这是可能的。你可以做SELECT a.x, b.x, c.x。 SQL Server 不强制列名在外部 select 上必须是唯一的
  • @penguat - 这也是允许的。 SELECT * FROM (SELECT 1) A(X) JOIN (SELECT 1) B(X) ON A.X = B.X。即,如果您在多个列被称为 X 的连接上使用 *,您会遇到同样的问题,但这是不允许的。

标签: sql sql-server tsql


【解决方案1】:

不,这是不可能的。

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

【讨论】:

    【解决方案2】:

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

    假设某些表(示例中的bd)有一个名为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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-21
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多