我有一张机场代码对表:
|iata|icao|
-----------
|ORD |KORD|
|JFK |KJFK|
|LAX |KLAX|
|SFO |KSFO|
我想运行一个将返回此表中不存在的代码的查询,因此如果我运行包含ATL,ORD,MIA,SFO的查询(对iata列),它将返回ATL和MIA,因为它们都不会那些存在于我的桌子里。这可能吗?
答案 0 :(得分:2)
如果你有一个运行代码的查询,这里有一种方法:
select mc.*
from (<your query goes here>) mc
where mc.iata not in (select iata from AirportCodePairs acp)
您也可以使用left 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)
答案 1 :(得分:0)
您可以使用要搜索的值创建一个表,然后执行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
答案 2 :(得分:0)
select your_columns from tableA minus select your_columns from tableB
请注意,两者必须具有相同的列和类型及长度,否则将无效。
如果类型不同,则执行cast,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));