繁体   English   中英

SQL查询NOT IN从3个条件表

[英]SQL query NOT IN from 3 tables with conditions

我有表结构:

OLD_DATA

| 电邮| 类型

///////////////////////////////

客户

| email1 |

//////////////////////////////

象垃圾一样清除

| 电邮|


我需要查找不在表clients中但仍存在于表old_data中的记录,该记录的类型为'Accounts'。 所以我写了这段代码:

SELECT `email` FROM `old_data`
WHERE `type` = 'Accounts' AND `email` NOT IN (SELECT `email1` FROM `clients`))

然后,我需要在此结果记录中找到不在表trashes 所以我写了这段代码:

SELECT * FROM (SELECT `email` FROM `old_data` 
WHERE `type` = 'Accounts' AND `email` NOT IN (SELECT `email1` FROM `clients`)) AS t1 
WHERE t1.email NOT IN (SELECT `email` FROM `trashes`)

这里的问题是,我在表old_data中有1条电子邮件的多个记录,然后键入“帐户”。 在表trashes ,但在表clients不是。 我需要这样写查询:

从不是clients电子邮件的old_data中获取所有记录,但是如果clients email1与old_data电子邮件匹配,则从结果中删除带有该电子邮件的所有记录。 但是,如果从此结果中将电子邮件与表trashes中的电子邮件匹配,则从结果中仅删除该电子邮件中的一条记录。

请帮助,我迷路了...

您可以通过链接条件使用not in

SELECT od.`email`
FROM `old_data` od
WHERE od.`type` = 'Accounts' AND
      od.`email` NOT IN (SELECT `email1` FROM `clients`) AND
      od.email NOT IN (SELECT `email` FROM `trashes`);

我更喜欢子查询not exists ,因为它可以更好地处理NULL值。

我设法使用另一个参数。

SELECT * FROM (SELECT `email`, `secretId` FROM `old_data`
WHERE `type` = 'Accounts' AND `email` NOT IN (SELECT `email1` FROM `clients`)) AS t1 
WHERE t1.secretId NOT IN (SELECT `secretId` FROM `trashes` WHERE `type` = 'Accounts')

也适用于

SELECT od.`email`, od.`secretId`
FROM `old_data` od
WHERE od.`type` = 'Accounts' AND
      od.`email` NOT IN (SELECT `email1` FROM `clients`) AND
      od.`secretId` NOT IN (SELECT `secretId` FROM `trashes` WHERE `type` = 'Accounts');

感谢您的帮助。 :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM