查询表中缺少的项目

时间:2013-04-08 16:50:02

标签: sql sqlite

我有一张机场代码对表:

|iata|icao|
-----------
|ORD |KORD|
|JFK |KJFK|
|LAX |KLAX|
|SFO |KSFO|

我想运行一个将返回此表中不存在的代码的查询,因此如果我运行包含ATL,ORD,MIA,SFO的查询(对iata列),它将返回ATL和MIA,因为它们都不会那些存在于我的桌子里。这可能吗?

3 个答案:

答案 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)

在oracle中你可以使用减号命令示例

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));