【问题标题】:Combining two queries without using Union在不使用联合的情况下组合两个查询
【发布时间】:2023-04-06 15:32:01
【问题描述】:

我有两个查询,想在不使用“UNION”的情况下合并这两个查询

例如

查询 1:

Select
    T1.Field1,T1.Field2,T2.Field3
from
    T1, T2, T3
where T1.XYZ = T2.XYZ AND T1.STATUS = 'S' AND T1.XYZ = T3.XYZ AND T3.ABC = 'Y';

结果:1​​0 行

查询 2:

Select
    T1.Field1,T1.Field2,T2.Field3
from
    T1, T2, T4
where
    T1.XYZ = T2.XYZ AND T1.STATUS = 'W' AND T1.XYZ = T4.XYZ AND T4.ABC = 'Y';

结果:5 行。

有没有办法在不使用“UNION”的情况下将查询 1 和查询 2 合并为一个,并得到结果为 15 (10+5)。

提前致谢

【问题讨论】:

  • 你在用什么RDBMS
  • 从不在 from 中使用逗号,总是使用明确的 join 语法。
  • 我的感觉是不行 - 你必须使用联合(或联合全部)。
  • T3 和 T4 的用途是什么?它们实际上并没有限制来自 T1 或 T2 的任何数据,因为您正在进行交叉连接并且它们与 T1 或 T2 无关;由于您没有显示来自 T3 或 T4 的任何数据;我无法弄清楚为什么它甚至在任何一个查询中。交叉连接是否会使记录数量膨胀一些所需的数量?因为在 T3 和 T5 中有多个 ABC = Y 的记录? (我需要一组样本数据才能在没有联合的情况下解决这个问题)
  • 抱歉,我更新了我的查询。

标签: mysql sql oracle11g


【解决方案1】:

只需更改您的查询,如下所示。

select t1.field1, 
       t1.field2, 
       t2.field3 
from 
       t1, 
       t2, 
       t3 
where  t1.xyz = t2.xyz 
AND   (t1.status = 'S' OR t1.status = 'W') 
AND    t3.abc = 'Y'

编辑 1:

在两个查询中都知道一张表不同后。以下应该工作。我已将逗号更改为JOINS

select t1.field1, 
       t1.field2, 
       t2.field3 
from   t1 t1 
       inner join t2 t2 
               on t1.xyz = t2.xyz         
where  t1.status IN ( 'S', 'W' ) 

我同意 @xQbert 的观点,即不需要 t3 和 t4 的 CROSS JOIN。即使它增加了数量或记录,但我想不出在这个特定查询中使用这些表的任何理由。

编辑 2:在问题中的新更新之后,以下查询应该可以工作

select t1.field1, 
       t1.field2, 
       t2.field3 
from   t1 t1 
       inner join t2 t2  on t1.xyz = t2.xyz 
       left join t3 t3 on t1.xyz = t3.xyz and t3.abc = 'Y'
       left join  t4 t4 on  t1.xyz = t4.xyz and t4.abc = 'Y'
where  t1.status IN ( 'S', 'W' )
and (t3.xyz is not null or t4.xyz is not null) 

【讨论】:

  • 在第一个查询和第二个查询第三个表是不同的。第一个查询是 T3,第二个查询是 T4
  • 那么左连接有什么意义呢?没有从 T3 或 T4 中选择。并且由于它是左连接,因此您不会限制 T1、T2 中的数据...
  • @xQbert,你说得对,这没有任何意义,我会更新答案。
  • t1 别名为t1 和表t2 别名为t2 是否有原因?
  • @PeterAbolins 没有具体原因,这只是我通常遵循的。使用的表名是 t1、t2、t3,我没有为这些表找到好的别名。
【解决方案2】:

可以写成:

Select T1.Field1,T1.Field2,T2.Field3 
from T1, T2, T3, T4 
where T1.XYZ = T2.XYZ 
AND T1.STATUS IN('W','S') 
AND (T4.ABC = 'Y' OR T3.ABC = 'Y')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多