尝试在mysql中执行减号操作

2skhul33  于 2021-07-24  发布在  Java
关注(0)|答案(6)|浏览(415)

我想表演一个 MINUS mysql中的操作。我有三个表:
一个有服务细节
一张表上写着服务是在哪提供的
另一个表(基于zipcode和state)显示了不提供此服务的位置。
我能够分别获得这两个select查询的输出。但是我需要一个组合语句,它的输出为“selectquery\u1-selectquery\u2”。
服务\详细信息表服务\代码(pk)服务名称
服务\状态表服务\代码(fk)状态国家pk(服务\代码,状态,国家)
异常表服务代码(fk)zipcode state pk(服务代码,zipcode,state)

m1m5dgzv

m1m5dgzv1#

这些表必须具有相同的列,但我认为您可以通过这些列实现所需的功能 EXCEPT ... 除了那个 EXCEPT 只适用于标准sql!下面介绍如何在mysql中执行此操作:

SELECT * FROM Servicing_states ss WHERE NOT EXISTS 
   ( SELECT * FROM Exception e WHERE ss.Service_Code = e.Service_Code);

http://explainextended.com/2009/09/18/not-in-vs-not-exists-vs-left-join-is-null-mysql/
标准sql

SELECT * FROM Servicing_States
EXCEPT
SELECT * FROM Exception;
yiytaume

yiytaume2#

这是我的两分钱。。。一个复杂的查询刚刚使它工作,最初用减号表示,并翻译为mysql
带负号:

select distinct oi.`productOfferingId`,f.name 
from t_m_prod_action_oitem_fld f
     join t_m_prod_action_oitem oi 
    on f.fld2prod_action_oitem = oi.oid;
minus
select
  distinct r.name,f.name
from t_m_prod_action_oitem_fld f
     join t_m_prod_action_oitem oi 
    on f.fld2prod_action_oitem = oi.oid
     join t_m_rfs r 
    on r.name = oi.productOfferingId
     join t_m_attr a 
    on a.attr2rfs = r.oid and f.name = a.name;

不存在

select distinct oi.`productOfferingId`,f.name 
from t_m_prod_action_oitem_fld f
     join t_m_prod_action_oitem oi 
    on f.fld2prod_action_oitem = oi.oid
where not exists (
select
  r.name,f.name
from t_m_rfs r 
     join t_m_attr a 
    on a.attr2rfs = r.oid   
where r.name = oi.productOfferingId and f.name = a.name
soat7uwm

soat7uwm3#

反连接模式是我通常使用的方法。这是一个外部连接,返回查询\u1中的所有行,以及查询\u2中匹配的行,然后过滤掉所有匹配的行。。。只保留查询\u 1中不匹配的行。例如:

SELECT q1.* 
     FROM ( query_1 ) q1
     LEFT
     JOIN ( query_2 ) q2 
       ON q2.id = q1.id 
    WHERE q2.id IS NULL

模仿 MINUS set操作符,我们需要连接 predicate 来比较q1和q2返回的所有列,还需要匹配null值。

ON q1.col1 <=> q2.col2
      AND q1.col2 <=> q2.col2
      AND q1.col3 <=> q2.col3
      AND ...

同时,要充分模仿 MINUS 操作时,我们还需要删除q1返回的重复行。添加 DISTINCT 关键字就足够了。

nafvub8i

nafvub8i4#

如果表很大并且很相似,一种选择是将pk保存到新表中。然后仅基于pk进行比较。如果您知道前半部分是相同的,那么只在特定的值或日期之后添加一个where子句进行检查。

create table _temp_old ( id int NOT NULL PRIMARY KEY )

create table _temp_new ( id int NOT NULL PRIMARY KEY )

### will take some time

insert into _temp_old ( id ) 
select id from _real_table_old  

### will take some time

insert into _temp_new ( id ) 
select id from _real_table_new

### this version should be much faster

select id  from _temp_old to where not exists ( select id from _temp_new tn where to.id = tn.id)

### this should be much slower

select id  from _real_table_old rto where not exists ( select id from _real_table_new rtn where rto.id = rtn.id )
bhmjp9jg

bhmjp9jg5#

mysql不识别减号和相交,这是基于oracle的操作。在mysql中,用户可以使用 NOT IN 作为 MINUS (其他解决方案也有,但我非常喜欢)。例子:

select a.id 
from table1 as a 
where <condition> 
AND a.id NOT IN (select b.id 
                 from table2 as b 
                 where <condition>);
ct3nt3jp

ct3nt3jp6#

mysql不支持minus或except,可以使用not exists、null或not in。

相关问题