Возврат единственной строки в INNER JOIN - PullRequest
3 голосов
/ 18 января 2011

Я бы хотел вернуть первый ряд только из внутреннего соединения.У меня есть две таблицы:

Строки в TABLE_D и TABLE_E могут иметь одинаковые даты создания, поэтому я сначала получаю MAX (creationdate), а затем MAX (id) из этого набора.Вот мой полный запрос:

</p> <pre> 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 ( c.i = ( 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 ( d.i = ( 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 ) ) ) ) </pre> <p>

Мой подзапрос, чтобы получить все строки с максимальной датой создания, и из-за этого максимальный идентификатор отлично работает, когда я вызываю его сам по себе, но когда я добавляю егок INNER JOIN (см. выше) я получаю строку для каждой совпадающей строки в таблице D и таблице E. Мне нужна одна строка для TABLE_A.id, показывающая только самую последнюю строку из TABLE_D, связанную с TABLE_C, и самую последнюю из TABLE_E, связаннуюс TABLE_D.

Например, идентификаторы в моем наборе результатов на данный момент выглядят так:

</p> <pre> -------------------------------------------------------------------------- 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 </pre> <p> мне нужно вот что: </p> <pre> -------------------------------------------------------------------------- A_ID B_ID C_ID D_ID E_ID -------------------------------------------------------------------------- 1 101 201 302 406 </pre> <p>

Спасибозаранее за вашу помощь.

Ответы [ 4 ]

1 голос
/ 18 января 2011

Что я хотел бы сделать, это переместить внутренний запрос, чтобы выбрать предложение. Я просто буду сохранять прямое отображение при фильтрации

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)
1 голос
/ 18 января 2011

Используйте аналитическую функцию ROW_NUMBER (), которая доступна в oracle11g

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
0 голосов
/ 18 января 2011

Может быть, это будет работать для вас?

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
0 голосов
/ 18 января 2011

Вы можете вставить свой запрос в подзапрос и использовать фильтр WHERE ROWNUM <2. </p>

SELECT * FROM
(/* Your SQL */)
WHERE ROWNUM < 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...