【问题标题】:Restricting inner query with outer query atttribute使用外部查询属性限制内部查询
【发布时间】:2016-10-14 11:09:34
【问题描述】:

我目前有一个需要修改的大型 SQL 查询(不是我的)。我有一个交易和估值表。该交易与估值具有一对多的关系。这两个表是通过外键连接的。

如果某笔交易的估值在某个日期之后不存在,我被要求防止任何交易(连同其后续估值)被退回。我认为实现这一点的方法是使用内部查询,但我需要让内部查询了解外部查询和事务。所以像:

SELECT * FROM TRANSACTION_TABLE T 
INNER JOIN VALUATION_TABLE V WHERE T.VAL_FK = V.ID 
WHERE (SELECT COUNT(*) FROM V WHERE V.DATE > <GIVEN DATE>) > 1

显然上述方法不起作用,因为内部查询是独立的,我无法从内部引用外部查询 V 引用。我该怎么做呢,还是有更简单的方法?

这只是在外部查询中设置 WHERE V.DATE > 的情况,因为如果其中任何一个交易超过指定日期,我想阻止对给定交易进行任何估值,而不仅仅是那些超过指定日期的交易。

非常感谢您提供的任何帮助。

【问题讨论】:

    标签: sql oracle join


    【解决方案1】:

    你可能会找这个

    SELECT * 
    FROM TRANSACTION_TABLE T 
    INNER JOIN VALUATION_TABLE V1 ON T.VAL_FK = V1.ID 
    WHERE (SELECT COUNT(*) 
           FROM VALUATION_TABLE V2 
           WHERE V2.ID = V1.ID AND V2.DATE > <GIVEN DATE>) > 1
    

    【讨论】:

    • 我认为你 (OP) 想要&gt; 0。如果是这样,您可以使用exists 来加快速度。
    • 再次阅读问题,您可能还想要相反的条件:= 0not exists
    【解决方案2】:
    SELECT * 
    FROM  TRANSACTION_TABLE T 
          INNER JOIN VALUATION_TABLE V1 ON T.VAL_FK = V.ID 
    WHERE V.ID IN ( SELECT ID 
                    FROM   VALUATION_TABLE
                    WHERE  DATE > <GIVEN DATE>
                  )
    

    如果执行时间很重要,您可能需要根据实际数据测试各种解决方案,看看哪种解决方案最适合您的情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-22
      相关资源
      最近更新 更多