为什么我不适用" ON"与交叉申请

时间:2016-12-15 09:22:32

标签: sql-server sql-server-2008 sql-server-2005

我想使用CROSS APPLY和表值函数,因为它是推荐的。

因此,对于一个实例,这非常好。

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

1 个答案:

答案 0 :(得分:0)

您不能像在INNER中那样在CROSS APPLY中使用ON左|对... |申请但有一定的灵活性,您可以根据您的要求使用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