我有 2 个表 t1 和 t2,两个表都有 3 列 id、status、run_date。
从 t1 中找到 id
t2 中的状态与 t1 中的状态不同,并且 t2 中的 run_date 早于 t1
t2 中不存在
3)在t2表中,同一id可能会多次出现,但运行日期不同 对于 run_date 比较,请仅取最近发生的一次。
我尝试了下面的查询,但我在第二个条件(状态差异)处出现错误,因为子查询返回多行。请帮忙解决这个问题。
错误:[UNSUPPORTED_SUBQUERY_EXPRESSION_CATEGORY.MUST_AGGREGATE_CORRELATED_SCALAR_SUBQUERY] 不支持的子查询表达式:相关标量子查询必须聚合才能最多返回一行。第 11 行第 31 位;
WITH most_recent_id AS(
select id,max(run_date) as latest_run_date
from t2
group by id
)
SELECT t1.id
FROM t1
LEFT JOIN most_recent_id ON t1.id = most_recent_id.id
WHERE (most_recent_id.id IS NULL) OR
(t1.status <> (select status from t2 a where a.id=t1.id and a.run_date=most_recent_id.latest_run_date)
AND most_recent_id.latest_run_date < t1.run_date)
您可以从不匹配的 LEFT JOIN 开始,以获取 t2 中每个 id 的最新行:
SELECT t2.id, t2.status, t2.run_date
FROM t2
LEFT JOIN t2 t2later ON
t2.id = t2later.id
AND t2.run_date < t2later.run_date
WHERE t2later.run_date IS NULL
然后,您可以将其用作第二个不匹配的 LEFT JOIN 中的子查询,以获取与条件的倒数不匹配的 t1 行:
SELECT t1.id
FROM t1
LEFT JOIN (
SELECT t2.id, t2.status, t2.run_date
FROM t2
LEFT JOIN t2 t2later ON
t2.id = t2later.id
AND t2.run_date < t2later.run_date
WHERE t2later.run_date IS NULL
) t2max ON
t1.id = t2max.id
AND (t1.status = t2max.status OR t1.run_date < t2max.run_date)
WHERE t2max.id IS NULL