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