Sql server 存储过程:返回表1中不在表2中的具有条件的行

Sql server 存储过程:返回表1中不在表2中的具有条件的行,sql-server,tsql,stored-procedures,Sql Server,Tsql,Stored Procedures,有人能帮我用存储过程返回 表1中NoPro=AR102的表2中不存在的NoCond 表1 NoCond Cat 001 G 002 G 003 G 004 G 005 G 006 G 表2 NoPro NoCond Cat AR101 002 G AR101 005 G AR102 003 G AR102 006 G AR103 001 G AR103 005 结果应

有人能帮我用存储过程返回 表1中NoPro=AR102的表2中不存在的NoCond

表1

NoCond  Cat
001     G
002     G
003     G
004     G
005     G
006     G
表2

NoPro   NoCond  Cat
AR101    002    G
AR101    005    G

AR102    003    G
AR102    006    G

AR103    001    G
AR103    005
结果应该是:

NoCond
001
002
004
005
在对问题#1598322的回答中尝试了一些例子,但没有一个奏效


谢谢

给你!编辑注释并在Sql Server Management Studio中运行。它采用
NoPro
作为参数。 ANSI_为空 去

正如下面他在回答中指出的,有几种方法可以实现实际的记录检索。

在这种情况下,“不存在”是您的朋友。这段代码应该在Oracle和SQL Server中都能工作,而且变化很小,主要是在其他DBMS中:

SELECT * FROM Table_1 T1
WHERE NOT EXISTS (
    SELECT 1 FROM Table_2 T2
    WHERE T1.NoCond = T2.NoCond
      AND T2.NoPro = 'AR102'
)
如果您只需要“NoCond”值,并且知道它将在SQL Server 2005版或更高版本上使用,那么您的朋友除外:

SELECT NoCond FROM Table_1 T1
EXCEPT
SELECT NoCond FROM Table_1 T2 WHERE T2.NoPro = 'AR102'

对于Oracle,将“除”替换为“减”,同样适用-它通常更快。

您使用的是哪种DBMS?博士后?甲骨文?对不起,忘了包括在内。这是SQL Server 2008和2012。如果任何答案解决了您的问题,请接受它,以便具有相同或类似问题的其他用户知道哪一个对您最有用。+1表示使用参数进行概括!问题是,在SQL Server中,我不时发现使用“不存在”或“除了”通常比使用左连接并与NULLJoe进行比较要快,谢谢,它可以工作!我现在遇到的问题是,它应该返回表_1中的NoCond和Name列,而表_2中不存在列名。我尝试在select for T1中添加列,但由于Name不是T2中的列,因此我得到了一个错误。Joe,我刚刚尝试在T1 select中使用NULL作为第二个参数,结果成功了。
CREATE PROCEDURE MY_SP
@NOPRO VARCHAR(5)
AS
BEGIN  
        SELECT T1.NOCOND 
        FROM TABLE_1 T1 
        LEFT OUTER JOIN TABLE_2 T2
        ON T1.NOCOND = T2.NOCOND
        WHERE T2.NOCOND IS NULL
        AND T2.NOPRO = @NOPRO
END
CREATE PROCEDURE MY_SP
@NOPRO VARCHAR(5)
AS
BEGIN  
        SELECT T1.NOCOND 
        FROM TABLE_1 T1 
        LEFT OUTER JOIN TABLE_2 T2
        ON T1.NOCOND = T2.NOCOND
        WHERE T2.NOCOND IS NULL
        AND T2.NOPRO = @NOPRO
END