Sql server SQL-在同一表、不同列中匹配相同的值
我试图确认一个进程,它发送一个方向标志为'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 idSql 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
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条件下无效