2016-12-15 42 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