我想表演一个 MINUS
mysql中的操作。我有三个表:
一个有服务细节
一张表上写着服务是在哪提供的
另一个表(基于zipcode和state)显示了不提供此服务的位置。
我能够分别获得这两个select查询的输出。但是我需要一个组合语句,它的输出为“selectquery\u1-selectquery\u2”。
服务\详细信息表服务\代码(pk)服务名称
服务\状态表服务\代码(fk)状态国家pk(服务\代码,状态,国家)
异常表服务代码(fk)zipcode state pk(服务代码,zipcode,state)
6条答案
按热度按时间m1m5dgzv1#
这些表必须具有相同的列,但我认为您可以通过这些列实现所需的功能
EXCEPT
... 除了那个EXCEPT
只适用于标准sql!下面介绍如何在mysql中执行此操作:http://explainextended.com/2009/09/18/not-in-vs-not-exists-vs-left-join-is-null-mysql/
标准sql
yiytaume2#
这是我的两分钱。。。一个复杂的查询刚刚使它工作,最初用减号表示,并翻译为mysql
带负号:
不存在
soat7uwm3#
反连接模式是我通常使用的方法。这是一个外部连接,返回查询\u1中的所有行,以及查询\u2中匹配的行,然后过滤掉所有匹配的行。。。只保留查询\u 1中不匹配的行。例如:
模仿
MINUS
set操作符,我们需要连接 predicate 来比较q1和q2返回的所有列,还需要匹配null值。同时,要充分模仿
MINUS
操作时,我们还需要删除q1返回的重复行。添加DISTINCT
关键字就足够了。nafvub8i4#
如果表很大并且很相似,一种选择是将pk保存到新表中。然后仅基于pk进行比较。如果您知道前半部分是相同的,那么只在特定的值或日期之后添加一个where子句进行检查。
bhmjp9jg5#
mysql不识别减号和相交,这是基于oracle的操作。在mysql中,用户可以使用
NOT IN
作为MINUS
(其他解决方案也有,但我非常喜欢)。例子:ct3nt3jp6#
mysql不支持minus或except,可以使用not exists、null或not in。