加入只抓取不匹配的记录 SQL
Join to grab only non-matching records SQL
我有一些数据正在尝试清理,以便 运行 进一步分析。 table 中的一列称为 record_type,这可以是 NEW 或 DEL。这意味着最初可能会添加一条 NEW 记录,但稍后会出现 DEL 记录,表明该特定记录现在已过期(NEW 和 DEL 记录将在 record_id 上匹配)。但是,NEW 和 DEL 记录都会保留在数据中,不会被删除。
所以我计划做的是创建两个 CTE,一个仅用于 DEL 记录,一个仅用于 NEW 记录:
WITH deleted_rec AS(
SELECT *
FROM main_table
WHERE record_type = 'DEL'
)
, new_rec AS(
SELECT *
FROM main_table
WHERE record_type = 'NEW'
)
然后在两个 CTE 的 record_id 列上进行外部联接。
SELECT *
FROM new_rec
FULL OUTER JOIN deleted_rec ON deleted_rec.record_id = new_rec.record_id
目标是让输出只包含没有 DEL 记录的记录 record_id 这样我就可以保证我的所有类型的 NEW 记录final table 不会在任何时候为他们提供 DEL 记录,因此他们都将处于活动状态。但是,我忘记了 FULL OUTER JOIN return 一切,而不仅仅是不匹配的东西,所以有没有办法解决这个问题以获得我想要的输出?
我只使用具有现有逻辑的单个查询:
SELECT *
FROM main_table t1
WHERE record_type = 'NEW' AND
NOT EXISTS (SELECT 1 FROM main_table t2
WHERE t2.id = t1.id AND t2.record_type = 'DEL');
用简单的英语来说,上面的查询是要找到所有 NEW
的记录,这些记录也不与相同的 id
另一条记录 DEL
.[=14 相关联=]
我有一些数据正在尝试清理,以便 运行 进一步分析。 table 中的一列称为 record_type,这可以是 NEW 或 DEL。这意味着最初可能会添加一条 NEW 记录,但稍后会出现 DEL 记录,表明该特定记录现在已过期(NEW 和 DEL 记录将在 record_id 上匹配)。但是,NEW 和 DEL 记录都会保留在数据中,不会被删除。
所以我计划做的是创建两个 CTE,一个仅用于 DEL 记录,一个仅用于 NEW 记录:
WITH deleted_rec AS(
SELECT *
FROM main_table
WHERE record_type = 'DEL'
)
, new_rec AS(
SELECT *
FROM main_table
WHERE record_type = 'NEW'
)
然后在两个 CTE 的 record_id 列上进行外部联接。
SELECT *
FROM new_rec
FULL OUTER JOIN deleted_rec ON deleted_rec.record_id = new_rec.record_id
目标是让输出只包含没有 DEL 记录的记录 record_id 这样我就可以保证我的所有类型的 NEW 记录final table 不会在任何时候为他们提供 DEL 记录,因此他们都将处于活动状态。但是,我忘记了 FULL OUTER JOIN return 一切,而不仅仅是不匹配的东西,所以有没有办法解决这个问题以获得我想要的输出?
我只使用具有现有逻辑的单个查询:
SELECT *
FROM main_table t1
WHERE record_type = 'NEW' AND
NOT EXISTS (SELECT 1 FROM main_table t2
WHERE t2.id = t1.id AND t2.record_type = 'DEL');
用简单的英语来说,上面的查询是要找到所有 NEW
的记录,这些记录也不与相同的 id
另一条记录 DEL
.[=14 相关联=]