我需要在连接中添加子查询,因为一个付款可以有多个分配,所以我只需要考虑第一个匹配(其中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;
答案 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" />