将两个sql查询合并为一个?

时间:2010-10-26 15:21:33

标签: sql mysql

我在同一个表上有两个类似的查询,但是条件相同,但选择不同。

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倍的时间内运行。

是否有更快的方法,因为数据库基本上只需扫描一次,然后只是格式化问题。

由于

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