Sql server SQL-在同一表、不同列中匹配相同的值

Sql server SQL-在同一表、不同列中匹配相同的值,sql-server,exists,Sql Server,Exists,我试图确认一个进程,它发送一个方向标志为'O'的文档id,然后接收到相同的文档id,并将其记录在同一个表中,但记录在一个新行和不同的列中:src_document_id,方向标志为'I' 需要识别已发送的记录,其中方向标志=O没有与src_文档\u id匹配的值,其中方向标志=I。在对照入站值检查出站值时,不确定是否使用EXISTS或Not EXISTS 下表中的EX:查询应返回文档\u id 34567,因为该文档没有方向\u flag=I的相应src\u文档\u id select

我试图确认一个进程,它发送一个方向标志为'O'的文档id,然后接收到相同的文档id,并将其记录在同一个表中,但记录在一个新行和不同的列中:src_document_id,方向标志为'I'

需要识别已发送的记录,其中方向标志=O没有与src_文档\u id匹配的值,其中方向标志=I。在对照入站值检查出站值时,不确定是否使用EXISTS或Not EXISTS

下表中的EX:查询应返回文档\u id 34567,因为该文档没有方向\u flag=I的相应src\u文档\u id

select
    document_id
from
    DOCUMENT_TABLE 
where
    direction_flag = 'O'
    and
    client_id = '9999'
    and
    EXISTS
    (
        select
            document_id
        from
            DOCUMENT_TABLE
        where
            document_id != src_document_id and direction_flag = 'I'
    )  
希望我说得够清楚了。不太精通SQL

DOCUMENT_ TABLE:

Document_id     client number   Direction flag    src_document_id 
12345             9999               O  
23456             9999               O
34567             9999               O  

aaaaa                                 I                12345
aaaab                                 I                23456

您可以使用左联接在id字段上将表联接到自身。这将显示左侧的所有记录,仅显示右侧匹配的记录。在where子句中,您可以筛选出与src_document_id为null不匹配的记录

SELECT
d1.document_id
FROM DOCUMENT_TABLE d1
LEFT JOIN DOCUMENT_TABLE d2 ON d1.document_id = d2.src_document_id 
WHERE
d1.direction_flag = 'O' AND
d2.src_document_id IS NULL AND
d2.direction_flag = 'I'

相关子查询通常性能较差。我认为使用自连接子查询会更好


相关子查询一般来说是存在于SELECT子句或WHERE子句中的子查询,并针对集合中的每一行进行计算,这自然是低效的,因为“按*m复杂度思考”,并不总是导致优化的执行计划

我要这个:

SELECT
    [source].document_id
FROM
    (
        SELECT
            document_id
        FROM
            document_table
        WHERE
            direction_flag = 'O'
    ) AS [source]
    LEFT JOIN
    (
        SELECT
            document_id,
            src_document_id
        FROM
            document_table
        WHERE
            direction_flag = 'I'
    ) AS [dest]
        ON [source].document_id = [dest].src_document_id
 WHERE
    dest.document_id IS NULL
注意:我对我的子查询使用完整查询,因为它使源文档的document_表和目标文档的document_表之间的意图和区别与更紧凑的查询相比更为清晰,如-这完全取决于样式和可读性,因为两个查询都是正确的。

都是正确的

但是有一个小错误。要获得正确答案,应如下所示:

SELECT
d1.document_id
FROM DOCUMENT_TABLE d1
LEFT JOIN DOCUMENT_TABLE d2 ON d1.document_id = d2.src_document_id 
AND d2.direction_flag = 'I'
WHERE
d1.direction_flag = 'O' AND
d2.src_document_id IS NULL
由于d2.src_document_id始终为null,因此语句d2.direction_flag='I'在where条件下无效