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

私は私が適用CROSSを使用する必要があるクエリの下に持っているという理由だけで「ON」を適用しようとしています。 INNERのように適用されますが、CROSSでON使用することはできません

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

「クロス」には「オン」はありません。 'ON'は' INNER'または 'OUTER'でのみ有効です。 – Ben

+1

私はまだあなたが 'ON'節を望む理由を理解していませんか? 'WHERE'節を使うと、論理的には同じです。一般的には、 'CROSS'結合は' ON'を持たず、そうではありません。デカルト結合になります。 – sagi

+0

'cross apply'は「十字結合」であり、十字結合には結合列がありません。標準的なキーワードを使用すると、より明確になります。 'cross apply'は、標準SQLの' cross join lateral'と同じです。 –

答えて

0

| 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 
関連する問題