簡體   English   中英

在INNER JOIN上返回一行

[英]Returning a single row on an INNER JOIN

我想僅從內連接返回第一行。 我有兩張桌子:

TABLE_D和TABLE_E中的行可以具有相同的創建日期,因此我首先獲得MAX(creationdate),然后從該集合獲得MAX(id)。 這是我的完整查詢:

 SELECT a.id as A_ID, b.id as B_ID, c.id as C_ID, d.id as D_ID, e.id as E_ID, d.CREATIONDATE, a.REFNUMBER, a.DATECREATED, a.INFO, e.COST, FROM TABLE_A a INNER JOIN TABLE_B b ON (b.id = a.id) INNER JOIN TABLE_C c ON (c.id = b.id) INNER JOIN TABLE_D d ON ( ci = ( select d.id FROM TABLE_D WHERE TABLE_D.id = c.id AND TABLE_D.id = ( select max(id) from TABLE_D t1 where c_id = c.id and CREATIONDATE = ( select max(CREATIONDATE) from TABLE_D t2 where t2.c_id = t1.c_id ) ) ) ) INNER JOIN TABLE_E e ON ( di = ( select e.d_id from TABLE_E where d_id = d.id AND id = ( select max(id) from e t1 where e.d_id = d.id and CREATIONDATE = ( select max(CREATIONDATE) from TABLE_E t2 where t2.d_id = t1.d_id ) ) ) ) 

我的子查詢獲取具有最大創建日期的所有行,並且當我自己調用它時,max id工作正常,但是當我將它添加到INNER JOIN(參見上文)時,我為表D中的每個匹配行獲取一行我想要的是每個TABLE_A.id一行,只顯示TABLE_D與TABLE_C關聯的最新行以及與TABLE_D關聯的最新TABLE_E。

例如,我的結果集中的id現在看起來像這樣:

 -------------------------------------------------------------------------- A_ID B_ID C_ID D_ID E_ID -------------------------------------------------------------------------- 1 101 201 301 401 1 101 201 301 402 1 101 201 301 403 1 101 201 302 404 1 101 201 302 405 1 101 201 302 406 

我需要的是這個:

 -------------------------------------------------------------------------- A_ID B_ID C_ID D_ID E_ID -------------------------------------------------------------------------- 1 101 201 302 406 

在此先感謝您的幫助。

使用oracle11g中提供的分析函數ROW_NUMBER()

SELECT *
FROM 
(
SELECT
    a.id as A_ID,b.id as B_ID,c.id as C_ID,d.id as D_ID,e.id as E_ID,
    d.CREATIONDATE,a.REFNUMBER,a.DATECREATED,a.INFO,e.COST,
    row_number() over (
        partition by a.id, b.id, c.id
        order by d.CREATIONDATE DESC, d.id desc, e.CREATIONDATE DESC, e.id desc) RN
FROM TABLE_A a
INNER JOIN TABLE_B b ON (b.id = a.id)
INNER JOIN TABLE_C c ON (c.id = b.id)
INNER JOIN TABLE_D d ON d.c_id = c.id
INNER JOIN TABLE_E e ON e.d_id = d.id
) N
WHERE RN = 1

只需確保PARTITION和ORDER BY子句是正確的

partition by a.id, b.id, c.id
    => start numbering from 1 again when any one of these changes
order by d.CREATIONDATE DESC, d.id desc, e.CREATIONDATE DESC, e.id desc)
    => number the rows in this order

我要做的是將內部查詢移動到select子句。 我將在過濾時保持直接映射

SELECT
a.id as A_ID,
b.id as B_ID,
c.id as C_ID,
(select max(d.id) from d where d.id =c.id) as d_id)
FROM 
TABLE_A a
INNER JOIN TABLE_B b ON (b.id = a.id)
INNER JOIN TABLE_C c ON (c.id = b.id)

您可以在子查詢中插入查詢並使用WHERE ROWNUM <2過濾器。

SELECT * FROM
(/* Your SQL */)
WHERE ROWNUM < 2

也許這對你有用嗎?

SELECT TOP 1
a.id as A_ID,
b.id as B_ID,
c.id as C_ID,
d.id as D_ID,
e.id as E_ID,
d.CREATIONDATE,
a.REFNUMBER,
a.DATECREATED,
a.INFO,
e.COST,
FROM 
TABLE_A a
INNER JOIN TABLE_B b ON (b.id = a.id)
INNER JOIN TABLE_C c ON (c.id = b.id)
INNER JOIN TABLE_D d ON (c.i = d.id)
INNER JOIN TABLE_E e ON ( d.i = e.id )
ORDER BY d.creationdate DESC, e.creationdate DESC

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM