2016-12-15 1 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 APPLY를 사용해야하기 때문에 "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

'CROSS'에는 'ON'이 없습니다. 'ON'은'INNER' 또는'OUTER'에서만 유효합니다. – Ben

+1

'ON' 절을 왜 원하는지 아직도 이해가 안되니? 'WHERE' 절을 사용하면 논리적으로 동일합니다. 일반적으로'CROSS' join은'ON'을 가지고 있지 않으며, 그렇지 않아야합니다. 그것은 데카르트 join을 만듭니다. – sagi

+0

'교차 적용'은 '교차 결합'이므로 크로스 조인에는 조인 열이 없습니다. 표준 키워드를 사용하면 명확 해집니다. '교차 적용'은 표준 SQL에서 '교차 결합'과 동일합니다. –

답변

0

CROSS APPLY에서 ON을 사용할 수 없습니다. INNER | 왼쪽 | 오른쪽 | 적용 가능하지만 약간의 융통성이 있으며 요구 사항에 따라 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 
관련 문제