Sql 在内部联接上返回一行

Sql 在内部联接上返回一行,sql,oracle11g,Sql,Oracle11g,我只想从内部联接返回第一行。我有两张桌子: 表D和表E中的行可以具有相同的创建日期,因此我首先从该集中获取MAXcreationdate,然后获取MAXid。以下是我的完整查询: 我的子查询使用max creationdate获取所有行,从中,当我自己调用max id时,max id可以正常工作,但当我将其添加到内部联接时,请参见上文,我将为表D和表E中的每个匹配行获取一行。我想要的是每个表a.id有一行,仅显示表D中与表C关联的最新行和最新的来自与表D关联的表E 例如,我的结果集中的id此时看

我只想从内部联接返回第一行。我有两张桌子:

表D和表E中的行可以具有相同的创建日期,因此我首先从该集中获取MAXcreationdate,然后获取MAXid。以下是我的完整查询:

我的子查询使用max creationdate获取所有行,从中,当我自己调用max id时,max id可以正常工作,但当我将其添加到内部联接时,请参见上文,我将为表D和表E中的每个匹配行获取一行。我想要的是每个表a.id有一行,仅显示表D中与表C关联的最新行和最新的来自与表D关联的表E

例如,我的结果集中的id此时看起来如下所示:

我需要的是:


提前感谢您的帮助。

使用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和orderby子句是正确的

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

您可以在子查询中插入查询并使用WHERE ROWNUM我要做的是将内部查询移动到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)

也许这对你有用


不幸的是,这不起作用,因为我需要每个a_ID一行。我只是在示例中添加了一个结果,表明我需要每个a_ID的最新D_ID和E_ID。谢谢。选择TOP 1不能在Oracle中使用
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 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 * FROM
(/* Your SQL */)
WHERE ROWNUM < 2
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)
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