NOT IN 方法改进

37 篇文章 0 订阅

今天在写一条sql查询语句,其需要从一个表A中返回所有A不再表B中的结果集,当然,这种实现最方便的方法就是用NOT IN

如:select a.* from a where a.id not in (select id from b where…..)

我们大家都知道很多sql方面的文章都建议大家尽量不要使用NOT IN的方法,因为这种方法的效率不高。那有没有替代的办法呢?(声明因为当时的情况要求不能使用储存过程,所以只有写sql语句)和同事实验了一下,结果用以下方法实现了。

 

目的:

替换NOT IN 方法。

说明:

在单条SQL语句中,不使用储存过程,不使用临时表。使用存储过程和临时表不再本文的讨论范围中。

实现:

例:

aa:结构

id                                       value   ……

1                                        a

2                                            b

3                                            c

4                                            d

5                                            e

6                                            f

---------------------------------------------------------------------------------------------

 

bb:结构

id    ……

2

4

6

 

现在我要取表aa里的所有字段,条件是aaid值不在bbid值当中(not in)。也就是应该返回所有id为奇数的字段

 

使用NOT INSQL:

select * from aa where id not in(select id from bb)

就一条语句,简单明了,可惜效率不高,而且公司规范要求尽量不用NOT IN,害我费了好大事crying……

 

改造后的SQL:

select cc.id,cc.value from (select aa.*,bb.id as tempcolum from aa left join bb on aa.id=bb.id) as cc where cc.tempcolum is null

 

解释一下。在开始时候我最早想用内联表的方式,可是无论如何也每找到一个好的办法,干脆就是实现不了。(大家有好办法指教先。)

后来自己考虑了一下NOT IN的逻辑,A NOT IN B就是说A是主体,B起到的之不过是一个判断作用,我们可以先把所有符合条件的A记录全部查询出来而不管他是否属于B,然后再从这里剔除值同时属于B的部分。

Select aa.* from aa

但是仅仅这样是不够的,我们无法利用这个返回的结果集判断是否属于B并排除它,为此,我想到构造一个临时的列,这个列的值应该是在A的结果集范围内,所有在B中的值。而这个结果集的主体应该是所有满足先决条件的A,然后加上满足条件的B,而不满足条件的B值则不再考虑范围内,所以用了left join

这一段是关键,不知道我阐述清楚了没有,没明白的继续看

于是就出来这一句。

select aa.*,bb.id as tempcolum from aa left join bb on aa.id=bb.id

没看明白上面的看结果集就明白了

id  value        tempcolum

---------------------------------------------

1     a                NULL

2     b                2

3     c                NULL

4     d                4

5     e                NULL

6     f                6

 

看到这个结果集我想大家都明白我的意思了吧。对了,我们就是要对这个结果集进行二次操作。

相信大家都看到了,生成的这个结果集包含了所有符合条件的表aa字段和bbid,如果aa中的值在bb中,则tempcolum的值就不会为null,如果不在就是null,这样我们只需要从这个结果集里查询所有tempcolum值为null的就可以满足我们的要求了

所以最终的sql出来了

select cc.id,cc.value from (select aa.*,bb.id as tempcolum from aa left join bb on aa.id=bb.id) as cc where cc.tempcolum is null

我们只需要idvalue两个字段,其他的就不要了。

结果

id  value

-------------------------

1     a        

3     c        

5           e        

 

ok,实现了,希望对大家有帮助。

### 回答1: 这个问题可以通过将主线程加入主循环来解决。可以使用事件循环机制来实现,例如使用 asyncio 库中的 run_until_complete() 函数。另外,也可以使用 Qt 框架中的 QEventLoop 类来实现。具体的实现方法需要根据具体的代码情况来确定。 ### 回答2: "main thread is not in main loop" 是一个错误消息,通常在编程中使用多线程或多进程的情况下出现。它表示主线程没有在主循环中运行,可能是由于一些错误或逻辑问题造成的。 要解决这个问题,我们可以采取以下步骤: 1. 检查代码逻辑:首先,确保代码中没有错误。检查是否有意外的跳出主循环的语句或逻辑错误。请确认程序流程是否正确,且没有意外的退出或退出循环的情况。 2. 确保主线程在主循环中运行:确认主线程是在主循环中运行的。主循环是一个应用程序的核心部分,负责处理用户输入,事件和其他任务。确保代码中没有在主线程外执行的操作。 3. 使用正确的多线程或多进程机制:如果需要使用多线程或多进程,确保使用正确的机制。例如,在Python中,可以使用threading和multiprocessing模块来实现这些功能。确保将主线程放在主循环中运行,并正确管理其他线程或进程。 4. 使用同步机制:如果涉及共享数据或同时访问关键资源的情况,确保使用适当的同步机制。例如,使用锁或线程安全的数据结构来避免竞争条件和数据不一致问题。 5. 参考文档和示例代码:如果以上方法仍然无法解决问题,建议参考相关文档和示例代码。对于特定语言和框架,通常会有详细的说明和示例,可以帮助理解并解决此问题。 最后,解决"main thread is not in main loop"问题需要仔细分析代码,确保所有的线程和进程都正确地在主循环中运行,并且使用适当的同步机制来保证程序的正确性。 ### 回答3: 解决 "main thread is not in main loop" 的问题的方法取决于出现此错误的具体情况。一般来说,这个错误意味着主线程(main thread)没有在主循环(main loop)中。以下是几种可能的解决方法: 1. 检查代码:仔细检查代码,确保所有与主线程有关的操作都在主循环中执行。主线程通常用于处理用户交互和应用程序逻辑,而主循环负责处理事件和更新UI。如果有操作没有放在主循环中,可以将其移动到适当的位置。 2. 使用合适的线程:如果有其他线程在执行操作,确保它们不会影响主线程的运行。可以使用线程同步机制,如锁或条件变量,来协调不同线程之间的操作,以确保主线程的正常运行。 3. 检查库或框架:如果错误是在使用某个库或框架时出现的,建议查阅相关文档或寻求社区支持。库或框架的作者通常会提供解决此类错误的具体建议或修复方法。 4. 更新软件版本:如果错误是由软件版本不兼容或存在已知错误导致的,可以尝试更新软件版本。这样可以获得已修复的错误和改进的功能,从而解决问题。 5. 寻求专业帮助:如果无法解决问题,建议联系相关领域的专业人员寻求帮助。他们可能会针对具体情况提供更具体的解决方法。 值得注意的是,由于缺乏具体的背景信息,这些解决方法可能并不适用于所有情况。因此,理解问题的具体背景和原因是解决问题的关键。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值