2016-08-18 50 views
0

我对混淆如何与连接一起工作感到困惑。经过一些Google搜索后,我发现使用CTE可以获得我想要的行为,但不清楚为什么我的初始尝试失败。加入别名SQL Server

总之 - 为什么会发生这种工作:

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; 
+1

你错过了“SELECT FROM”之前'dbo.Table1' – Anton

+0

是的......他们不一样 - CTE有一个选择,而子表没有。 –

回答

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

将是有效的(虽然()括号是多余的)。它看起来像你试图给一个新的名字,以一个由JOINTable1Table2之间产生的结果集。 SQL中没有这样的功能 - 在连接之后,结果集仍然使用应用于两侧输入结果集的别名(例如,在这里为AB)引用。

可以创建一个新的别名的结果集,而不是做一个完整的子查询,如安东建议在评论中,或通过使用CTE,因为你已经找到。

你在哪里可能会混淆的是,有能够在FROM子句中使用的一些其它选项,如PIVOTAPPLY,在这里可以提供一种由这样的操作者产生的结果集的新名称。 JOIN没有要求(也没有选择)这样做。

+0

谢谢,这很好地清除它。 – learningAsIGo

0

试试这个,它会工作,

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