2016-12-15 62 views
0

我想按照推荐使用CROSS APPLY和表值函数。为什么我不能在CROSS APPLY上应用“ON”

所以,对于这个例子,这工作得很好。

SELECT 
    TBL1.pkId, 
    TBL1.roleIS, 
    TBL1.Name INTO #tmpTBL 
FROM TBL1 
CROSS APPLY Convert(@keys, ',') AS ArrayTBL 
WHERE ArrayTBL.item = TBL1.pkId 

但是,只要我尝试应用“ON”关键字,它就开始显示语法错误。为什么它是如此 它也是一种内部连接?

SELECT 
    TBL1.pkId, 
    TBL1.roleIS, 
    TBL1.Name INTO #tmpTBL 
FROM TBL1 
CROSS APPLY Convert(@keys, ',') AS ArrayTBL 
ON ArrayTBL.item = TBL1.pkId 

我想申请“ON”只是因为我有以下查询我需要使用CROSS APPLY。

Select Tbl1.pkey, Tbl1.Name, Tbl2.EmployeeName 
    from Tbl1 inner join Tbl2 on Tbl1.id= Tbl2.Id 
    inner join Convert(@keys, ',') AS Array 
    ON Tbl2.ItemId = Array.item 
    inner join Tbl3 on tbl3.id = Array.item 
    inner join #tmpTBL on #tmpTBL.pkId = Tbl3.id 
+2

“CROSS”中没有'ON'。 'ON'只对'INNER'或'OUTER'有效。 – Ben

+1

我还是不明白你为什么要'ON'子句?使用'WHERE'子句,它们在逻辑上是相同的。一般来说''CROSS'连接没有'ON',它不应该,它会进行笛卡尔连接。 – sagi

+0

因为'cross apply'是一个“交叉连接” - 而一个交叉连接没有连接列。使用标准关键字可以更清楚地说明:“交叉应用”与标准SQL中的“交叉连接横向”相同。 –

回答

0

您不能在CROSS APPLY中使用ON,如INNER | LEFT |正确|申请,但有一定的灵活性,您可以根据您的要求使用CROSS APPLY。尝试使用CROSS APPLY的以下查询,您将得到所有不同的输出:

CREATE TABLE #test(id INT, ename VARCHAR(20)) 
CREATE TABLE #testOne(id INT, test_id INT, pname VARCHAR(20)) 

INSERT INTO #test VALUES 
(1, 'Test'), 
(2, 'Test1'), 
(3, 'Test2') 

INSERT INTO #testOne VALUES 
(1, 1, 'Test3'), 
(2, 1, 'Test4'), 
(3, 2, 'Test5') 

SELECT t.id, t.ename, p.pname 
FROM #test t 
CROSS APPLY(SELECT pname FROM #testOne) p 

SELECT t.id, t.ename, p.pname 
FROM #test t 
CROSS APPLY(SELECT pname FROM #testOne p WHERE p.test_id = t.id) p 

SELECT t.id, t.ename, p.pname 
FROM #test t 
CROSS APPLY(SELECT pname 
      FROM #testOne p 
      INNER JOIN #test tt ON tt.id = p.test_id 
      WHERE tt.id = 2) p 

SELECT t.id, t.ename, p.pname 
FROM #test t 
CROSS APPLY(SELECT pname FROM #testOne) p 
WHERE t.id = 2 
相关问题