我想知道如何在不必写出(或使数据库进程)这个查询的主要部分两次的情况下执行此操作。使用相同的数据更高效地创建Oracle UNION查询
我的情况是我在查询Oracle企业数据库(我受DBA限制,所以有些解决方案可能无法正常工作,但我不确定我在什么程度上受到限制,直到我尝试并且不知道该去哪里)。
目前,我的查询如下所示:
SELECT
a.Field1,
a.Field2,
b.Field3,
b.Field4,
c.Field5
FROM
a,
b,
c,
WHERE
a.FieldX = b.FieldX
AND
b.FieldY = c.FieldY
UNION
(
SELECT
d.Field6 as Field1,
d.Field7 + d.Field8 as Field2,
MainQuery.Field3,
MainQuery.Field4,
MainQuery.Field5
FROM
(
SELECT
a.Field1,
a.Field2,
b.Field3,
b.Field4,
c.Field5
FROM
a,
b,
c,
WHERE
a.FieldX = b.FieldX
AND
b.FieldY = c.FieldY
AND
a.FieldZ = 'XXXX'
) MainQuery,
d
WHERE
MainQuery.Field1 = d.Field6
)
简单地说,我有一个主查询(第一部分),返回我的结果的大部分,然后我重复与主查询额外限制(a.FieldZ = 'XXXX'
),并从此查询中提取数据,并使用UNION
将第二个表格附加到主查询中。
我面临的主要挑战是Field1
& Field2
的定义在2个查询之间发生了变化,所以我无法弄清楚如何进行简单的连接。但是我相信必须有一种方法可以实现这一点,而不必让数据库查询两次相同的数据。
有关如何使此查询更高效的任何想法?
谢谢!
基于注释,解释多一点关于这个查询 - 我所试图做的就是我的整个数据unvierse查询上半年,然后在第二个上多余的行追加查询的记录的一半,其中a.FieldZ = 'XXXX'
其中计算是Field1
和Field2
请问您可以发表表格定义吗? – twoleggedhorse 2013-02-21 14:52:05
你能用这个查询解释你在现实世界中想要做什么吗? – 2013-02-21 14:53:13
首先,你的伪查询是错误的(选择field6,而你只在子查询中选择5)。接下来,如果我理解正确,您希望FieldA具有不同的值,具体取决于FieldZ是否为XXX。有更好的解决方案可以做到这一点(例如'DECODE') – Najzero 2013-02-21 14:54:26