我有兩個表。第二個通過m_id引用第一個。Oracle:左連接非常大的表並將連接的行限制爲最大的值
主表
M_ID | M_FIELD
1 | 'main1'
2 | 'main2'
3 | 'main3'
子表
S_ID | S_FIELD | S_ORDER | M_ID
1 | 'sub1-1' | 1 | 1
2 | 'sub1-2' | 2 | 1
3 | 'sub1-3' | 3 | 1
4 | 'sub2-1' | 1 | 2
5 | 'sub2-2' | 2 | 2
6 | 'sub2-3' | 3 | 2
7 | 'sub3-1' | 1 | 3
8 | 'sub3-2' | 2 | 3
9 | 'sub3-3' | 3 | 3
我需要連接這兩個表(由M_ID
),但是從我只需要與最大的行值爲S_ORDER
。
所以查詢的預期結果是:
M_ID | M_FIELD | S_FIELD
1 | 'main1' | 'sub1-3'
2 | 'main2' | 'sub2-3'
3 | 'main3' | 'sub3-3'
有這個問題的答案與解析函數工作液:How do I limit the number of rows returned by this LEFT JOIN to one? (我將它張貼在底部) 但問題是那Sub-Table
是非常大的(實際上是一些內部計算的視圖),這種子查詢的工作方式太長了。所以,我想我需要通過M_ID 第一後,才篩選出表找到最大S_ORDER
我需要像這樣簡單的東西(因爲第二級子查詢不看M.M_ID
從而未能領域場之外):
CREATE TABLE t_main (m_id NUMBER PRIMARY KEY,
m_field VARCHAR2(10));
CREATE TABLE t_sub (s_id NUMBER PRIMARY KEY,
s_field VARCHAR2(10),
s_order NUMBER,
m_id NUMBER);
INSERT INTO t_main VALUES (1,'main1');
INSERT INTO t_main VALUES (2,'main2');
INSERT INTO t_main VALUES (3,'main3');
INSERT INTO t_sub VALUES (1,'sub1-1', 1, 1);
INSERT INTO t_sub VALUES (2,'sub1-2', 2, 1);
INSERT INTO t_sub VALUES (3,'sub1-3', 3, 1);
INSERT INTO t_sub VALUES (4,'sub2-1', 1, 2);
INSERT INTO t_sub VALUES (5,'sub2-2', 2, 2);
INSERT INTO t_sub VALUES (6,'sub2-3', 3, 2);
INSERT INTO t_sub VALUES (7,'sub3-1', 1, 3);
INSERT INTO t_sub VALUES (8,'sub3-2', 2, 3);
INSERT INTO t_sub VALUES (9,'sub3-3', 3, 3);
COMMIT;
上述(正與LARG太慢提到工作溶液:
SELECT m.*,
(SELECT s_field
FROM (SELECT s_field
FROM t_sub s
WHERE s.m_id = m.m_id
ORDER BY s_order DESC)
WHERE ROWNUM = 1) s_field
FROM t_main m;
創建和填充所述測試模式中的代碼ËT_SUB
表):
SELECT m.*,
s.s_field
FROM t_main m
LEFT JOIN
(SELECT *
FROM
(SELECT ts.*,
ROW_NUMBER() OVER (PARTITION BY m_id
ORDER BY s_order DESC) AS seq
FROM t_sub ts)
WHERE seq = 1) s ON s.m_id = m.m_id;
我們使用的數據庫是Oracle 10g的
非常感謝您的幫助
謝謝! 這一個工程,但仍然很長 – Dany