如何将联合查询视为子查询 [英] How can I treat a UNION query as a sub query

查看:25
本文介绍了如何将联合查询视为子查询的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一组表,出于性能原因,这些表在逻辑上是一个被分成几个部分的表。我需要编写一个有效地将所有表连接在一起的查询,因此我使用结果的单个WHERE子句。我已经成功地对每个子表显式使用WHERE子句的结果使用了UNION,如下所示

SELECT * FROM FRED_1 WHERE CHARLIE = 42
UNION 
SELECT * FROM FRED_2 WHERE CHARLIE = 42
UNION 
SELECT * FROM FRED_3 WHERE CHARLIE = 42

但是,因为有10个单独的子表,所以每次更新WHERE子句都很痛苦。我想要的是这样的

SELECT * 
FROM (
    SELECT * FROM FRED_1 
    UNION 
    SELECT * FROM FRED_2 
    UNION 
    SELECT * FROM FRED_3) 
WHERE CHARLIE = 42

如果有所不同,则需要针对DB2数据库运行查询。

这是我需要做的更全面(经过清理)的版本。

select * 
from ( select * from FRD_1 union select * from FRD_2 union select * from FRD_3 ) as FRD, 
     ( select * from REQ_1 union select * from REQ_2 union select * from REQ_3 ) as REQ, 
     ( select * from RES_1 union select * from RES_2 union select * from RES_3 ) as RES 
where FRD.KEY1 = 123456
  and FRD.KEY1 = REQ.KEY1
  and FRD.KEY1 = RES.KEY1
  and REQ.KEY2 = RES.KEY2

新信息:

看起来问题更多地与联合中的字段数量有关,而不是其他问题。如果我极大地限制了字段,我可以使下面的大多数语法变体正常工作。不幸的是,如此多地限制字段意味着结果查询虽然可能有用,但并没有给出我想要的结果。除了2个键之外,我还设法从其中一个表中获得了另外3个字段。如果超过该值,查询将失败。

推荐答案

我认为您必须为子查询结果命名。我不了解DB2,所以我是在冒险,但我知道这在其他几个平台上都可以工作。

SELECT * 
FROM (
    SELECT * FROM FRED_1 
    UNION 
    SELECT * FROM FRED_2 
    UNION 
    SELECT * FROM FRED_3) AS T1
WHERE CHARLIE = 42

这篇关于如何将联合查询视为子查询的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆