我在同一个表上有两个类似的查询,但是条件相同,但选择不同。
Select flatpos from archdetails
where version='1.3' AND compname IN (
select distinct compname from svn3 where revno='r270294'
)
AND
select count(distinct compname),
sum(CASE WHEN inFlat=1 THEN 1 ELSE 0 END),
min(flatLoopIndex)
from archdetails
where version='1.3'
AND compname IN (
select distinct compname from svn3 where revno='r270294'
)
正如您所看到的那样,查询位于同一个表archdetails
上,并且两者的条件也相同。
查询1将输出类似
的内容 12
47
查询2将输出类似
的内容 396 43 1
我希望输出为
12 396 43 1
47 396 43 1
我显然无法将它们组合在一起。
这些查询中的每一个都在x个时间内运行。我知道我可以将这些查询放入新查询的from子句中并获得所需的结果,但新查询会在2倍的时间内运行。
是否有更快的方法,因为数据库基本上只需扫描一次,然后只是格式化问题。
由于
答案 0 :(得分:0)
在临时表中选择第一个查询的结果。
然后从该临时表中获取第一个结果集select *
。
要获取第二个结果集,请将临时表连接到第二个查询,不添加任何where子句语句,也不从临时表中选择任何列。
(如果优化器以某种方式设法执行第二次查询N次,则将第二次查询的结果存入第二个临时表并加入2个临时表)
create temporary table tmp1
Select flatpos from archdetails
where version='1.3' AND compname IN (
select distinct compname from svn3 where revno='r270294'
)
create temporary table tmp2
select count(distinct compname) as c,
sum(CASE WHEN inFlat=1 THEN 1 ELSE 0 END) as s,
min(flatLoopIndex) as m
from archdetails
where version='1.3'
AND compname IN (
select distinct compname from svn3 where revno='r270294'
)
select * from tmp1
select tmp2.c, tmp2.s, tmp2.m from tmp1, tmp2
答案 1 :(得分:0)
<强>更新强>
您可以通过移除其中一个'select distinct compname from svn3 where revno='r270294''
通过
SELECT ad.flatpos ,
totals.compname,
totals.inFlat,
totals.flatlooopindex
FROM
archdetails ad
INNER JOIN
(select count(distinct compname) compname,
sum(CASE WHEN inFlat=1 THEN 1 ELSE 0 END) inFlat,
min(flatLoopIndex) flatlooopindex
from archdetails
where version='1.3'
AND compname IN (
select distinct compname from svn3 where revno='r270294'
)) totals
ON ad.compname = totals.compname