根据条件从表中获取id

问题描述 投票:0回答:1

我有 2 个表 t1 和 t2,两个表都有 3 列 id、status、run_date。

从 t1 中找到 id

  1. t2 中的状态与 t1 中的状态不同,并且 t2 中的 run_date 早于 t1

  2. 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)
sql mysql database subquery common-table-expression
1个回答
0
投票

您可以从不匹配的 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
© www.soinside.com 2019 - 2024. All rights reserved.