如何在Oracle中用UNION的结果联接表?

时间:2019-11-28 11:31:12

标签: sql oracle

我在Oracle数据库中有3个表。 FooDBflightsFooDB1FooDB2

我使用“ with”运算符来创建这些表的简化版本,名为FLIGHTSMESSAGES1MESSAGES2

我想做出一条返回一个表的选择语句。 FLIGHTS加入了MESSAGES1MESSAGES2

的并集

这是我的SQL语句。

WITH FLIGHTS AS (
    SELECT DISTINCT id,ARCADDR,CALLSIGN,trunc(FIRSTTIMEENTRY)
    AS DOE FROM FooDBflights
    WHERE FIRSTTIMEENTRY IS NOT null),
MESSAGES1 AS (
    SELECT DISTINCT flightID,AIRCRAFTADDRESS,trunc(SYS_DATETIME)
    FROM FooDB1
    WHERE AIRCRAFTADDRESS!=' ' ),
MESSAGES2 AS ( 
    SELECT DISTINCT flightID,AIRCRAFTADDRESS,trunc(SYS_DATETIME)
    FROM FooDB2
    WHERE AIRCRAFTADDRESS!=' ' )

SELECT a.*,b.*,substr(b.AIRCRAFTADDRESS, 3)
FROM FLIGHTS a
    LEFT JOIN MESSAGES1 b
    ON a.callsign=trim(b.flightid)
    AND trim(a.arcaddr)=substr(UPPER (b.AIRCRAFTADDRESS), 3)  

此查询返回FLIGHTSMESSAGES1完美结合,但我不知道如何在MESSAGES1MESSAGES2之间建立联合。我该怎么办?

1 个答案:

答案 0 :(得分:1)

with子句中执行合并将是最简单的:

代替

MESSAGES1 AS ...
MESSAGES2 AS ...

要做:

MESSAGES AS (
    SELECT flightID,AIRCRAFTADDRESS,trunc(SYS_DATETIME) AS DT
    FROM FooDB1
    WHERE AIRCRAFTADDRESS!=' '
    UNION 
    SELECT flightID,AIRCRAFTADDRESS,trunc(SYS_DATETIME)
    FROM FooDB2
    WHERE AIRCRAFTADDRESS!=' ' )

...并在我们的主要SELECT查询中引用该地址。

请注意,一旦执行DISTINCT,就不需要UNION

备注

在连接条件中使用trim()可能会在有大量数据时使查询变慢:数据库引擎无法从索引中受益。最好有外键并将其强制为数据库约束。这样trim就没有必要了。

substr()upper()也可能会对性能产生负面影响。考虑在表本身中将字段AIRCRAFTADDRESS分成两部分,并确保插入时文本已经大写。