我在Oracle数据库中有3个表。 FooDBflights
,FooDB1
和FooDB2
。
我使用“ with”运算符来创建这些表的简化版本,名为FLIGHTS
,MESSAGES1
和MESSAGES2
。
我想做出一条返回一个表的选择语句。 FLIGHTS
加入了MESSAGES1
和MESSAGES2
这是我的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)
此查询返回FLIGHTS
和MESSAGES1
完美结合,但我不知道如何在MESSAGES1
和MESSAGES2
之间建立联合。我该怎么办?
答案 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
分成两部分,并确保插入时文本已经大写。