【问题标题】:Join Alias SQL Server加入别名 SQL Server
【发布时间】:2016-08-18 00:45:54
【问题描述】:

我对别名如何与连接一起使用有些困惑。经过一番谷歌搜索后,我发现使用 CTE 可以获得我想要的行为,但不清楚为什么我的初始尝试失败了。

简而言之 - 为什么会这样:

WITH C AS 
(
    SELECT 
        * 
    FROM 
        dbo.Table1 as A 
    INNER JOIN
        dbo.Table2 as B ON A.Col1 = B.Col1
)
SELECT C.Col2 
FROM C;

但这不是吗?

SELECT 
    C.Col2
FROM
    (dbo.Table1 as A
INNER JOIN
    dbo.Table2 as B ON A.Col1 = B.Col1) as C;

【问题讨论】:

  • 您在 'dbo.Table1' 之前错过了“SELECT FROM”
  • 是的......它们是不同的 - CTE 有一个选择,而子表没有。

标签: sql-server join sql-server-2012


【解决方案1】:
SELECT 
    B.Col2
FROM
    (dbo.Table1 as A
INNER JOIN
    dbo.Table2 as B ON A.Col1 = B.Col1);

将是有效的(尽管() 括号是多余的)。看起来您正试图为JOINTable1Table2 之间生成的结果集命名。 SQL 中没有这样的功能 - 在连接之后,仍然使用应用于两侧输入结果集的别名来引用结果集(例如 AB 这里)。

可以为结果集创建一个新的别名,方法是按照 Anton 在 cmets 中建议的那样创建一个完整的子查询,或者使用您已经找到的 CTE。

您可能会感到困惑的是,还有一些其他选项可以在FROM 子句中使用,例如PIVOTAPPLY,您可以在其中为生成的结果集提供一个新名称由这样的运营商。 JOIN 没有要求(也没有选项)这样做。

【讨论】:

    【解决方案2】:

    试试这个,它会起作用的,

    SELECT B.Col2
    FROM dbo.Table1 AS A
    INNER JOIN dbo.Table2 AS B ON A.Col1 = B.Col1
    

    【讨论】:

      猜你喜欢
      • 2013-07-25
      • 2017-04-02
      • 2023-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多