如何在多个表中使用 UNION ALL 只查找一条​​记录

How to ind only one record with UNION ALL in multiple tables

抱歉问题的标题...

在不同的表中有多个具有相同 data_name 且具有不同 time_inserts 的记录。

我需要 data_name 和更老的 time_insert。我不能加入,只能联合所有

  1. data_name 是类型 VARCHAR2 (255 BYTE)
  2. time_insert 类型为 TIMESTAMP (6)

此查询有效但速度很慢。我认为它没有表现

select data_name,token,time_insert,path from table_0 where (data_name,time_insert) in 
(select data_name, min(time_insert) from table_0 where data_name like '%data_name_to_search%' group by data_name) 
union all 
select data_name,token,time_insert,path from table_1 where (data_name,time_insert) in 
(select data_name, min(time_insert) from table_1 where data_name like '%data_name_to_search%' group by data_name)
union all
select data_name,token,time_insert,path from table_2 where (data_name,time_insert) in 
(select data_name, min(time_insert) from table_2 where data_name like '%data_name_to_search%' group by data_name)

通常的做法是使用 ROW_NUMBER() 对行进行编号,然后仅选择行号 1

下面的代码 UNION ALL 将数据放在一起,然后过滤 data_name 并对行编号,然后仅选择编号为 1.

的行
SELECT
  table_id, data_name, token, time_insert
FROM
(
  SELECT
    unioned.*,
    ROW_NUMBER() OVER (PARITITION BY data_name ORDER BY time_insert) AS rn
  FROM
  (
    SELECT 0 AS table_id, data_name, token, time_insert, path FROM table_0
    UNION ALL
    SELECT 1 AS table_id, data_name, token, time_insert, path FROM table_1
    UNION ALL
    SELECT 2 AS table_id, data_name, token, time_insert, path FROM table_2
  )
    unioned
  WHERE
    data_name like '%data_name_to_search%'
)
  sorted
WHERE
  rn = 1

table_id 是不必要的,但有助于调试、测试等