首先,我创建了一个包含一列的内存表,并使用这些列值,我有一个内部连接与另一个表。这样做的同时我收到了这个错误:
必须声明标量变量 @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;
答案 0 :(得分:6)
在引用连接条件中的表时,必须使用别名
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)
答案 1 :(得分:0)
不确定您是否需要游标或临时表,我认为这在一个查询中的作用相同
SELECT UOM FROM Item
INNER JOIN (
SELECT DISTINCT ParentItem AccountID
from ItemBillOfMaterial
) Temporary
ON Item.ItemID=Temporary.AccountID
答案 2 :(得分:0)
虽然答案可能还不错,但这样做会不会更好:
SELECT UOM FROM Item WHERE UOM.ItemID IN (SELECT DISTINCT ParentItem FROM ItemBillOfMaterial)
而不是游标提取?抓取速度非常慢,根据您在上面添加的代码,工作似乎并不太复杂。
对不起,如果我在这里错了,您只是简化了任务,专注于您面临的问题。