Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 基于多个值检查一个表中的值是否不存在于另一个表中的最快方法_Sql_Plsql_Oracle11g - Fatal编程技术网

Sql 基于多个值检查一个表中的值是否不存在于另一个表中的最快方法

Sql 基于多个值检查一个表中的值是否不存在于另一个表中的最快方法,sql,plsql,oracle11g,Sql,Plsql,Oracle11g,这可能很容易,但我一直在绞尽脑汁。我有两张桌子(临时聚会和GTT聚会) 临时方和GTT方有以下列=>system、case_num、PARTY_id、PARTY、role 我想做的是根据系统、案例编号和PARTY id的独特组合,从TEMP_PARTY中查找GTT_PARTY中不存在的所有值 因此,我想把所有的派对从临时派对中拉出来,因为我在GTT派对中没有记录。记录由三列(系统、案例编号和参与方id)中的数据唯一标识 速度对我来说是个很大的问题。有人能帮忙吗 使用不存在如下 select *

这可能很容易,但我一直在绞尽脑汁。我有两张桌子(临时聚会和GTT聚会)

临时方和GTT方有以下列=>system、case_num、PARTY_id、PARTY、role

我想做的是根据系统、案例编号和PARTY id的独特组合,从TEMP_PARTY中查找GTT_PARTY中不存在的所有值

因此,我想把所有的派对从临时派对中拉出来,因为我在GTT派对中没有记录。记录由三列(系统、案例编号和参与方id)中的数据唯一标识


速度对我来说是个很大的问题。有人能帮忙吗

使用
不存在
如下

select * from TEMP_PARTY
where not exists 
(
select 1 from GTT_PARTY
where System = some_val
and case_num = 3
and party_id = 7
)
此外,您还可以使用
减号
运算符(如果我没有弄错
Oracle
的话,它与
相同,除了
SQL Server
中的
)如下


一种方法是反连接模式:

SELECT t.system
     , t.case_num
     , t.party_id
     , t.party
     , t.role
  FROM TEMP_PARTY t
  LEFT
  JOIN GTT_PARTY g
    ON g.system   = t.system
   AND g.case_num = t.case_num
   AND g.party_id = t.party_id
 WHERE g.system IS NULL
这是一个“外部”联接,返回来自
t
的所有行,以及来自
g
的所有匹配行,但我们在
WHERE
子句中添加了一个谓词,该谓词有效地排除了所有具有匹配的行。因此,我们剩下的是
t
中的行,它们在
g
中没有任何匹配的行

这不是;这不是获得结果的唯一途径。还有其他几种方法,例如,您可以使用
notexists
和相关子查询返回查询的等效结果

SELECT t.system
     , t.case_num
     , t.party_id
     , t.party
     , t.role
  FROM TEMP_PARTY t
 WHERE NOT EXISTS 
       ( SELECT 1
           FROM GTT_PARTY g
          WHERE g.system   = t.system
            AND g.case_num = t.case_num
            AND g.party_id = t.party_id
       )

为了获得最佳性能,我们希望看到一个索引(前导列为)

EXPLAIN
输出将显示执行计划


(我原以为这是针对MySQL的;同样的查询也适用于Oracle。)

很抱歉响应太晚。非常感谢。最后我用了负号,它成功了!
SELECT t.system
     , t.case_num
     , t.party_id
     , t.party
     , t.role
  FROM TEMP_PARTY t
 WHERE NOT EXISTS 
       ( SELECT 1
           FROM GTT_PARTY g
          WHERE g.system   = t.system
            AND g.case_num = t.case_num
            AND g.party_id = t.party_id
       )
... ON GTT_PARTY (system,case_num,party_id)