如何在多个表中使用 UNION ALL 只查找一条记录
How to ind only one record with UNION ALL in multiple tables
抱歉问题的标题...
在不同的表中有多个具有相同 data_name 且具有不同 time_inserts 的记录。
我需要 data_name 和更老的 time_insert。我不能加入,只能联合所有
- data_name 是类型 VARCHAR2 (255 BYTE)
- 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
是不必要的,但有助于调试、测试等
抱歉问题的标题...
在不同的表中有多个具有相同 data_name 且具有不同 time_inserts 的记录。
我需要 data_name 和更老的 time_insert。我不能加入,只能联合所有
- data_name 是类型 VARCHAR2 (255 BYTE)
- 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
是不必要的,但有助于调试、测试等