4

首先,我创建了一个包含一列的内存表,并使用这些列值与另一个表进行了内部连接。这样做时,我收到此错误:

必须声明标量变量@Temporary

谁能解释我哪里出错了?

DECLARE @ID INT
Declare @Temporary Table
(
AccountID INT
)  

DECLARE cur CURSOR FOR

SELECT DISTINCT ParentItem from ItemBillOfMaterial

OPEN cur

FETCH NEXT FROM cur INTO @ID;

WHILE @@FETCH_STATUS = 0

BEGIN 

Insert into @Temporary Values(@ID)  

FETCH NEXT FROM cur INTO @ID;

END

SELECT UOM FROM Item

INNER JOIN @Temporary

ON Item.ItemID=@Temporary.AccountID

CLOSE cur;

DEALLOCATE cur;
4

3 回答 3

8

在连接条件中引用表时必须使用别名

SELECT UOM FROM Item
INNER JOIN @Temporary t
ON Item.ItemID=t.AccountID

虽然这可以解决您遇到的问题,但您不需要临时表或游标。这个查询可以重写为:

SELECT UOM 
FROM Item
WHERE ItemID IN (SELECT DISTINCT ParentItem FROM ItemBillOfMaterial)
于 2013-04-23T11:54:05.107 回答
0

不确定您是否需要游标或临时表,我认为这在一个查询中大致相同

SELECT UOM FROM Item
INNER JOIN (
  SELECT DISTINCT ParentItem AccountID 
  from ItemBillOfMaterial
) Temporary
ON Item.ItemID=Temporary.AccountID
于 2013-04-23T11:59:15.400 回答
0

虽然答案可能很好,但这样做不是更好吗:
SELECT UOM FROM Item WHERE UOM.ItemID IN (SELECT DISTINCT ParentItem FROM ItemBillOfMaterial)
而不是光标获取?Fetch 非常慢,根据您在作业上方添加的代码,似乎并不太复杂。
抱歉,如果我在这里错了,您只是简化了任务以专注于您面临的问题。

于 2013-04-23T12:02:11.593 回答