查询两个不同的结果集,然后筛选每个包含的列

时间:2013-10-31 11:52:41

标签: sql oracle simplification

我有一个很大的解释(在我看来这是一个解释,实际上它是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

这将获得正确数量的结果,但是,我真的需要简化这一点,因为通过当前的代码生成器执行此操作将会非常棘手。

另外,我必须从

更改orderby
ORDER  BY UNIONTABLE.objectID, 
          UNIONTABLE.uniqueID 

Order by objectID, uniqueID

因为它正在放弃。

所以,是吗,有更简单的方法吗?它使用Oracle

感谢。

1 个答案:

答案 0 :(得分:1)

  

有更简单的方法吗?

好吧,您可以用

替换ObjectTable1 OT1
(SELECT * FROM ObjectTable1 UNION ALL
 SELECT * FROM ObjectTable2) OT1

“更容易”,但我不知道你失去了多少性能。