SQL技术问询:能否将带条件的SELECT语句与表直接左连接,无需创建中间查询?
解答你的SQL疑问
第一个问题:带筛选的SELECT能否直接左连接,无需中间查询?
- 完全可以!你不需要先创建中间查询,直接把带筛选条件的SELECT语句作为子查询,就能和其他表进行左连接操作。子查询是SQL里非常常用的写法,能帮你避免创建一堆临时查询或中间表,让逻辑更紧凑。
第二个问题:合并你的两个查询,实现同一步操作
当然可以合并!咱们直接把第一个IntInvoice查询的逻辑作为子查询嵌入到第二个查询里,替换掉原来的IntInvoice表名就行。合并后的完整SQL如下:
SELECT IntInvoiceSub.* FROM ( SELECT * FROM [U_Concatenar_Invoice Control] WHERE [U_Concatenar_Invoice Control].[Décision prise] IS NULL AND [U_Concatenar_Invoice Control].Concatenar IS NOT NULL AND [U_Concatenar_Invoice Control].N_AVD IS NOT NULL ) AS IntInvoiceSub LEFT JOIN Int_Account ON IntInvoiceSub.Concatenar = Int_Account.Concatenar WHERE Int_Account.Concatenar IS NULL AND IntInvoiceSub.Concatenar IS NOT NULL;
简单解释一下:
- 我们把原来的
IntInvoice查询用括号包起来,起个别名IntInvoiceSub(你也可以换成自己喜欢的名字),它就相当于原来的中间查询,但现在是直接嵌入主查询里的。 - 后面的左连接和筛选逻辑和你原来的第二个查询完全一致,只是把引用的表名换成了这个子查询的别名。
- 这样运行起来和你原来的两步查询效果完全一样,但不需要额外创建中间查询,逻辑也更集中。
如果你的SQL方言支持CTE(公共表表达式,比如SQL Server、PostgreSQL、MySQL 8.0+),也可以用更清晰的CTE写法,可读性会更好:
WITH IntInvoiceSub AS ( SELECT * FROM [U_Concatenar_Invoice Control] WHERE [U_Concatenar_Invoice Control].[Décision prise] IS NULL AND [U_Concatenar_Invoice Control].Concatenar IS NOT NULL AND [U_Concatenar_Invoice Control].N_AVD IS NOT NULL ) SELECT IntInvoiceSub.* FROM IntInvoiceSub LEFT JOIN Int_Account ON IntInvoiceSub.Concatenar = Int_Account.Concatenar WHERE Int_Account.Concatenar IS NULL AND IntInvoiceSub.Concatenar IS NOT NULL;
两种写法都能达到你的需求,选哪个看你自己的习惯和所用数据库的支持情况~
内容的提问来源于stack exchange,提问作者Alex Silva
相关产品推荐
相关产品推荐

