Transact SQL WHERE CURSOR

时间:2011-10-26 06:56:13

标签: sql sql-server

  

可能重复:
  SQL - find records from one table which don't exist in another

我有这张桌子

TableA  
uID   |   uData  
1     |   111  
2     |   222  
3     |   333  
4     |   444  
5     |   555  

Table B  
uID   |   uData2  
1     |   222  
2     |   444

我想要的只是从TableA中获取数据,而不是来自TableB的数据

  

输出

uID   |   uData  
1     |   111  
3     |   333 
5     |   555  

到目前为止,我做了这个解决方案

DECLARE allData CURSOR FOR
SELECT uData
FROM         TableA;
OPEN allData;
FETCH NEXT FROM allData;

print @allData;

--WHILE @@allData = '222'
--  BEGIN
--      FETCH NEXT FROM allData;
--  END
CLOSE allData;
DEALLOCATE allData;
GO

并收到此错误

  

必须声明标量变量“@allData”。

有没有其他方法可以在sql或任何其他解决方案中使用while而不执行此操作? :)

4 个答案:

答案 0 :(得分:3)

试试这个

    SELECT *
    FROM TableA 
    WHERE uData NOT IN (
       SELECT uData2
       FROM TableB
    )

答案 1 :(得分:2)

只需使用左连接并过滤掉第二个表中有数据的记录:

select t1.uID, t1.uData
from TableA t1
left join TableB t2 on t2.uData2 = t1.uData
where t2.uData2 is null

答案 2 :(得分:1)

不需要光标;只需使用以下方法从TableB中删除值:

select tableA.* 
from   tableA 
where  tableA.uData not in (select TableB.uData2 from TableB)

此外,CURSOR的语法错误。请查看this quick example以获取正确的CURSOR语法以供将来参考。

答案 3 :(得分:0)

使用此查询:

SELECT * FROM tableA 
LEFT JOIN tableB ON tableA.Uid = tableB.Uid
WHERE tableB.Uid IS NULL