连接上的子查询是否应使用where子句中外部查询的表?

时间:2017-11-26 21:13:11

标签: sql oracle join subquery

我需要在连接中添加子查询,因为一个付款可以有多个分配,所以我只需要考虑第一个匹配(其中rownum = 1)。

但是,我不确定是否将外部查询中的pmt添加到分配连接上的子查询是最好的。

我是否应该在性能命中等情况下以不同方式执行此操作。

      SELECT
            pmt.payment_uid,
            alt.allotment_uid,

        FROM
            payment pmt

/* HERE: is the reference to pmt.pay_key and pmt.client_id 
   incorrect in the below subquery? */

            INNER JOIN allotment alc ON alt.allotment_uid = (
                SELECT
                    allotment_uid
                FROM
                    allotment
                WHERE
                        pay_key = pmt.pay_key
                    AND
                        pay_code = 'xyz'
                    AND
                        deleted = 'N'
                    AND
                        client_id = pmt.client_id
                    AND
                        ROWNUM = 1
            )

        WHERE

            AND
                pmt.deleted = 'N'
            AND
                pmt.date_paid >= TO_DATE('2017-07-01')
            AND
                pmt.date_paid < TO_DATE('2017-10-01') + 1;

2 个答案:

答案 0 :(得分:0)

如果没有查看解释计划输出,很难在查询中识别性能问题。您的查询似乎确实在主查询的每个记录的分配上执行了额外的SELECT。

这是一个不使用相关子查询的版本。显然我无法测试它。它进行简单的连接,然后过滤除分配之外的所有记录。希望这可以帮助。

WITH v_payment
AS
(
     SELECT
            pmt.payment_uid,
            alt.allotment_uid,
            ROW_NUMBER () OVER(PARTITION BY allotment_id) r_num
        FROM
            payment pmt JOIN allotment alt
                          ON (pmt.pay_key = alt.pay_key AND
                              pmt.client_id = alt.client_id)
      WHERE pmt.deleted = 'N' AND
            pmt.date_paid >= TO_DATE('2017-07-01') AND
            pmt.date_paid < TO_DATE('2017-10-01') + 1 AND
            alt.pay_code = 'xyz' AND
            alt.deleted = 'N'
)
SELECT payment_uid,
       allotment_uid
  FROM v_payment
 WHERE r_num = 1;

让我们知道这是如何表现的!

答案 1 :(得分:0)

您可以通过这种方式表达查询。我更有可能这样做:

<ImageView
    android:id="@+id/imageView"
    android:layout_width="150dp" 
    android:layout_height="150dp"
    android:adjustViewBounds="false"
    android:scaleType="fitCenter"
    app:srcCompat="@mipmap/ic_cross" />