本文介绍了如何替换Exists以获得相同的结果的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



我有一个名为Order的表和另一个名为Order Detail的表。订单可以有一个
或多个订单明细 


表格的DDL和一些数据作为Bellow:

reate table commande( -- Order Table
   id int,
   libelle varchar(50)
   )
insert into commande values(1,'Cmd1'),(2,'Cmd2'),(3,'Cmd3'),(4,'Cmd4'),(5,'Cmd5'),(6,'Cmd6'),

(7,'Cmd7'),(8,'Cmd7')

create table detailCommande( -- Order Detail Table
	id_detailCommande int,
	id_commande int,
	categorie int
	)

insert into detailCommande values
(10,1,1012),
(11,1,11),(15,2,1012),(12,3,1013),(13,3,11),(14,4,9999),(15,4,11),(16,6,1012),(17,7,1012),(18,5,11),(19,5,9999),(20,5,1012)

我想选择所有具有类别11的订单但是  至少包含订单详细信息   1012或1013


I want to select all order that have a categorie 11 or not but it's contain at least on Order Detail  with value 1012 or 1013

I想要像下面这样的结果:

I want a result like as bellow :

id	libelle	id_detailCommande	id_commande	categorie
1	Cmd1	10	1	1012
1	Cmd1	11	1	11
2	Cmd2	15	2	1012
3	Cmd3	12	3	1013
3	Cmd3	13	3	11
6	Cmd6	16	6	1012
7	Cmd7	17	7	1012
5	Cmd5	18	5	11
5	Cmd5	20	5	1012





下面的查询给我正确的结果只是当
i使用时表现很差存在和查询需要更多时间,因为表格很大,我有更多的聚合加入 。当我删除快速存在查询工作

select * from commande
inner join detailCommande on id=id_commande
where (categorie in(1012,1013)
or categorie=11 and exists(select 1 from detailCommande a where a.id_commande=id and  categorie in(1012,1013))
)




有什么建议吗?

我怎么写同样的查询方式不同?

How Can i write the same query differently ?

感谢您的帮助

推荐答案

select * from commande c
inner join detailCommande dc on c.id=dc.id_commande
where  dc.categorie in(1012,1013) or
(dc.categorie=11 and exists(select 1 from detailCommande a
where a.id_commande=c.id and  a.categorie in(1012,1013)))


这篇关于如何替换Exists以获得相同的结果的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-16 06:09