我有一个机场代码对表:
|iata|icao|
-----------
|ORD |KORD|
|JFK |KJFK|
|LAX |KLAX|
|SFO |KSFO|
我想运行一个查询,该查询将返回此表中不存在的代码,因此如果我运行包含 ATL、ORD、MIA、SFO 的查询(针对 iata 列),它将返回 ATL 和 MIA,因为它们都不存在在我的桌子上。这可能吗?
如果您有一个运行代码的查询,这是一种方法:
select mc.*
from (<your query goes here>) mc
where mc.iata not in (select iata from AirportCodePairs acp)
您也可以通过 aleft outer join
和比较来做到这一点NULL
。我会推荐iata
在对表中的索引。
或者,如果您没有查询,您可以执行以下操作:
select mc.*
from (select 'ATL' as code union all
select 'ORD' union all
select 'MIA' union all
select 'SFO'
) mc
where mc.iata not in (select iata from AirportCodePairs acp)
您可以使用要搜索的值创建一个表,然后执行 JOIN:
CREATE TABLE tmp ( code char(3) NOT NULL);
INSERT INTO tmp (code) VALUES ('ATL'), ('ORD'), ('MIA'), ('SFO');
SELECT code FROM tmp
LEFT OUTER JOIN airportcode as ac ON tmp.code = ac.iata
WHERE ac.iata IS NULL
在 oracle 中,您可以使用减号命令示例
select your_columns from tableA minus select your_columns from tableB
请注意,两者必须具有相同的列、类型和长度,否则将不起作用。
如果类型不同,请执行强制转换、to_char、to_date 或任何使类型相同所需的函数。请注意,如果您必须在 where 子句中执行其中一项或任何 oracle 函数调用,则使用基于函数的索引。例如,如果在这样的 where 子句中调用 to_upper
select * from tableName a where to_upper(last_name)='SIMPSON'
将按如下方式创建关于此的索引
create index ixt on tableName(to_uppper(last_name));