表格1:
| account_no | **other columns**...
+------------+-----------------------
| 1 |
| 2 |
| 3 |
| 4 |
表 2:
| account_no | TX_No | Balance | History |
+------------+-------+---------+------------+
| 1 | 123 | 123 | 12.01.2011 |
| 1 | 234 | 2312 | 01.03.2011 |
| 3 | 232 | 212 | 19.02.2011 |
| 4 | 117 | 234 | 24.01.2011 |
我有多个连接查询,查询中的一个表(表 2)有问题,因为它是一个计算许多其他事物的视图,这就是为什么对该表的每个查询都是昂贵的。从表 2 中,对于account_no
表 1 中的每个我都需要具有最大 的整行TX_NO
,这就是我的做法:
SELECT * FROM TABLE1 A LEFT JOIN
( SELECT
X.ACCOUNT_NO,
HISTORY,
X.BALANCE
FROM TABLE2 X INNER JOIN
(SELECT
ACCOUNT_NO,
MAX(TX_NO) AS TX_NO
FROM TABLE2
GROUP BY ACCOUNT_NO) Y ON X.ACCOUNT_NO = Y.ACCOUNT_NO) B
ON B.ACCOUNT_NO = A.ACCOUNT_NO
正如我最初理解的那样,它将对Table2 中的所有行进行内部连接,然后将需要account_no
的左连接与Table1 进行连接,这是我想避免的。
我的问题:有没有办法只找到Table1 中的max(TX_NO)
那些帐户而不是遍历所有帐户?我认为这将有助于提高查询速度。
我认为您走在正确的轨道上,但我认为您不需要,而且我自己也不会按照您所做的方式嵌套子查询。相反,如果您想获取表 1 中的每条记录和表 2 中匹配的最大记录,您可以尝试以下操作:
SELECT * FROM TABLE1 t1
LEFT JOIN
(
SELECT t.*,
ROW_NUMBER() OVER (PARTITION BY account_no ORDER BY TX_No DESC) rn
FROM TABLE2 t
) t2
ON t1.account_no = t2.account_no AND
t2.rn = 1
如果你想继续你原来的方法,我会这样做:
SELECT *
FROM TABLE1 t1
LEFT JOIN TABLE2 t2
ON t1.account_no = t2.account_no
INNER JOIN
(
SELECT account_no, MAX(TX_No) AS max_tx_no
FROM TABLE2
GROUP BY account_no
) t3
ON t2.account_no = t3.account_no AND
t2.TX_No = t3.max_tx_no
我们没有使用窗口函数来查找 中每个帐户的最大记录TABLE2
,而是使用第二个连接到子查询。我希望窗口函数方法比这种双连接方法表现得更好,一旦你习惯了它,它会更容易阅读。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句