我有一个很大的解释(在我看来这是一个解释,实际上它是10页漫游)然后我的浏览器崩溃了。所以,我只是简单地概述一下这个问题,因为我不确定究竟需要哪些信息。
我有以下查询模型。最重要的是当前发生的事情,下面的是我需要发生的事情
DetailsTable
|
ObjectTable1
|
OtherDetailsTable
DetailsTable
/ \
ObjectTable1 ObjectTable2
\ /
OtherDetailsTable
ObjectTable1和ObjectTable2存储不同的对象,并且都是一个不包含数据的父对象的子对象。
他们有外键将它们链接到其他表。
我需要的查询是由代码生成的,似乎喜欢使用uniontables(除非我对查询进行硬编码,否则我无法真正控制它。
生成的当前查询如下:
SELECT UNIONTABLE.objectID,
UNIONTABLE.unqiueID,
UNIONTABLE.f,
UNIONTABLE.updatedate,
UNIONTABLE.version,
UNIONTABLE.objectID_updatedby,
UNIONTABLE.unqiueID_updatedby,
UNIONTABLE.amount,
UNIONTABLE.currency,
UNIONTABLE.name,
UNIONTABLE.number,
UNIONTABLE.funds,
UNIONTABLE.print,
UNIONTABLE.paydate,
UNIONTABLE.recover,
UNIONTABLE.address,
UNIONTABLE.payee,
UNIONTABLE.objectID_nominated,
UNIONTABLE.unqiueID_nominated,
UNIONTABLE.objectID_override,
UNIONTABLE.unqiueID_override,
UNIONTABLE.objectID_paymntspayee,
UNIONTABLE.unqiueID_paymntspayee,
UNIONTABLE.objectID_paymentspay,
UNIONTABLE.unqiueID_paymentspay
FROM (SELECT DISTINCT DT.objectID,
DT.UniqueID,
DT.f,
DT.updatedate,
DT.version,
DT.objectID_updatedby,
DT.unqiueID_updatedby,
DT.amount,
DT.currency,
DT.name,
DT.number,
DT.funds,
DT.print,
DT.paydate,
DT.recover,
DT.address,
DT.payee,
DT.objectID_nominated,
DT.uniqueID_nominated,
DT.objectID_override,
DT.uniqueID_override,
DT.objectID_paymntspayee,
DT.uniqueID_paymntspayee,
DT.objectID_paymentspay,
DT.uniqueID_paymentspay
FROM DetailsTable DT,
ObjectTable1 OT1,
OtherDetailsTable ODT
WHERE DT.uniqueID = OT1.uniqueID_ForeignKey1
AND OT1.uniqueID_ForeignKey2 = ODT.uniqueiD
AND Upper(ODT.Name) = 'STOCK1'
) UNIONTABLE
ORDER BY UNIONTABLE.objectID,
UNIONTABLE.uniqueID
如果只有一个ObjectTable,这将正常工作。为了获得所需模型的正确结果,我有查询
SELECT UNIONTABLE.objectID,
UNIONTABLE.unqiueID,
UNIONTABLE.f,
UNIONTABLE.updatedate,
UNIONTABLE.version,
UNIONTABLE.objectID_updatedby,
UNIONTABLE.unqiueID_updatedby,
UNIONTABLE.amount,
UNIONTABLE.currency,
UNIONTABLE.name,
UNIONTABLE.number,
UNIONTABLE.funds,
UNIONTABLE.print,
UNIONTABLE.paydate,
UNIONTABLE.recover,
UNIONTABLE.address,
UNIONTABLE.payee,
UNIONTABLE.objectID_nominated,
UNIONTABLE.unqiueID_nominated,
UNIONTABLE.objectID_override,
UNIONTABLE.unqiueID_override,
UNIONTABLE.objectID_paymntspayee,
UNIONTABLE.unqiueID_paymntspayee,
UNIONTABLE.objectID_paymentspay,
UNIONTABLE.unqiueID_paymentspay
FROM (SELECT DISTINCT DT.objectID,
DT.UniqueID,
DT.f,
DT.updatedate,
DT.version,
DT.objectID_updatedby,
DT.unqiueID_updatedby,
DT.amount,
DT.currency,
DT.name,
DT.number,
DT.funds,
DT.print,
DT.paydate,
DT.recover,
DT.address,
DT.payee,
DT.objectID_nominated,
DT.uniqueID_nominated,
DT.objectID_override,
DT.uniqueID_override,
DT.objectID_paymntspayee,
DT.uniqueID_paymntspayee,
DT.objectID_paymentspay,
DT.uniqueID_paymentspay
FROM DetailsTable DT,
ObjectTable1 OT1,
OtherDetailsTable ODT
WHERE DT.uniqueID = OT1.uniqueID_ForeignKey1
AND OT1.uniqueID_ForeignKey2 = ODT.uniqueiD
AND Upper(ODT.Name) = 'STOCK1'
) UNIONTABLE
UNION
SELECT UNIONTABLE.objectID,
UNIONTABLE.unqiueID,
UNIONTABLE.f,
UNIONTABLE.updatedate,
UNIONTABLE.version,
UNIONTABLE.objectID_updatedby,
UNIONTABLE.unqiueID_updatedby,
UNIONTABLE.amount,
UNIONTABLE.currency,
UNIONTABLE.name,
UNIONTABLE.number,
UNIONTABLE.funds,
UNIONTABLE.print,
UNIONTABLE.paydate,
UNIONTABLE.recover,
UNIONTABLE.address,
UNIONTABLE.payee,
UNIONTABLE.objectID_nominated,
UNIONTABLE.unqiueID_nominated,
UNIONTABLE.objectID_override,
UNIONTABLE.unqiueID_override,
UNIONTABLE.objectID_paymntspayee,
UNIONTABLE.unqiueID_paymntspayee,
UNIONTABLE.objectID_paymentspay,
UNIONTABLE.unqiueID_paymentspay
FROM (SELECT DISTINCT DT.objectID,
DT.UniqueID,
DT.f,
DT.updatedate,
DT.version,
DT.objectID_updatedby,
DT.unqiueID_updatedby,
DT.amount,
DT.currency,
DT.name,
DT.number,
DT.funds,
DT.print,
DT.paydate,
DT.recover,
DT.address,
DT.payee,
DT.objectID_nominated,
DT.uniqueID_nominated,
DT.objectID_override,
DT.uniqueID_override,
DT.objectID_paymntspayee,
DT.uniqueID_paymntspayee,
DT.objectID_paymentspay,
DT.uniqueID_paymentspay
FROM DetailsTable DT,
ObjectTable1 OT2,
OtherDetailsTable ODT
WHERE DT.uniqueID = OT2.uniqueID_ForeignKey1
AND OT2.uniqueID_ForeignKey2 = ODT.uniqueiD
AND Upper(ODT.Name) = 'STOCK1'
) UNIONTABLE
Order by objectID, uniqueID
这将获得正确数量的结果,但是,我真的需要简化这一点,因为通过当前的代码生成器执行此操作将会非常棘手。
另外,我必须从
更改orderbyORDER BY UNIONTABLE.objectID,
UNIONTABLE.uniqueID
要
Order by objectID, uniqueID
因为它正在放弃。
所以,是吗,有更简单的方法吗?它使用Oracle
感谢。
答案 0 :(得分:1)
有更简单的方法吗?
好吧,您可以用
替换ObjectTable1 OT1
(SELECT * FROM ObjectTable1 UNION ALL
SELECT * FROM ObjectTable2) OT1
它 “更容易”,但我不知道你失去了多少性能。