存储过程:使用条件从表1中返回不在表2中的行

时间:2014-01-31 23:10:27

标签: sql-server tsql stored-procedures

有人可以通过存储过程帮助我返回 来自Table_1的NoCond在Table_2中不存在NoPro = AR102

TABLE_1

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

TABLE_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的回复中尝试了一些例子,但都没有。

谢谢!

3 个答案:

答案 0 :(得分:1)

你走了!编辑注释并在Sql Server Management Studio中运行它。它需要NoPro作为参数。  ANSI_NULLS ON     GO

SET QUOTED_IDENTIFIER ON
GO

-- =============================================
-- Author: Stackoverflow User #325521
-- Create date: 31/01/2014
-- Application: 
-- Description: 
-- Version:     1.0.0.0
-- =============================================
CREATE PROCEDURE dbo.dcsp_GetNoConds
    @NoProID VARCHAR(16)
AS
BEGIN
    SET NOCOUNT ON

    SELECT T1.NoCond 
    FROM Table_1 T1 LEFT JOIN Table_2 T2
    ON T1.NoCond = T2.NoCond
    WHERE T2.NoCond IS NULL
        AND T2.NoPro = @NoProID 

END

GO

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

在这种情况下,“NOT EXISTS”是你的朋友。此代码应该在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或更高版本上使用,那么EXCEPT就是您的朋友:

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

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