SQL - использование значения во вложенном выборе - PullRequest
3 голосов
/ 26 мая 2011

Надеюсь, заголовок имеет какой-то смысл - я бы хотел сделать вложенный выбор, основанный на значении исходного выбора, например:

SELECT MAX(iteration) AS maxiteration,
       (SELECT column
        FROM   table
        WHERE  id = 223652
               AND iteration = maxiteration)
FROM   table
WHERE  id = 223652;  

Я получаю ошибку неверного идентификатора ORA-00904.

Буду очень признателен за любые советы о том, как вернуть это значение, спасибо!

Ответы [ 7 ]

3 голосов
/ 26 мая 2011

Похоже, что это должно быть переписано с предложением where:

select iteration,
       col
from tbl
where id = 223652
and iteration = (select max(iteration) from tbl where id = 223652);
2 голосов
/ 26 мая 2011

Поскольку вы используете Oracle, я бы предложил использовать аналитические функции для этого:

SELECT * FROM (
    SELECT col,
      iteration,
      row_number() over (partition by id order by iteration desc) rn
    FROM tab
    WHERE  id = 223652
) WHERE rn = 1
2 голосов
/ 26 мая 2011

Вы можете полностью обойти проблему, поместив подвыбор в INNER JOIN своего собственного.

SELECT t.iteration
       , t.column
FROM   table t
       INNER JOIN (
         SELECT id, MAX(iteration) AS iteration
         FROM   table
         WHERE  id = 223652
       ) tm ON tm.id = t.id AND tm.iteration = t.iteration
1 голос
/ 26 мая 2011

Не уверен на 100% в синтаксисе Oracle, но разве это не похоже на:

select iteration, column from table where id = 223652 order by iteration desc limit 1
1 голос
/ 26 мая 2011

сделай так:

with maxiteration as
(
    SELECT MAX(iteration) AS maxiteration
    FROM   table
    WHERE  id = 223652
)
select
    column, 
    iteration
from
    table
where
    id = 223652
    AND iteration = maxiteration
;
0 голосов
/ 26 мая 2011

Вы делаете что-то вроде

select maxiteration,column from table a join (select max(iteration) as maxiteration from table where id=1) b using (id) where b.maxiteration=a.iteration;

Это, конечно, может возвращать несколько строк для одного максимирования, если ваша таблица не имеет ограничений на это.

0 голосов
/ 26 мая 2011

Я бы подошел к этой проблеме немного по-другому. Вы в основном ищете строку, у которой нет других итераций больше, чем она. Есть как минимум 3 способа сделать это:

SELECT
    T1.iteration AS maxiteration,
    T1.column
FROM
    Table T1
WHERE
    T1.id = 223652 AND
    NOT EXISTS
    (
        SELECT *
        FROM Table T2
        WHERE
            T2.id = 223652 AND
            T2.iteration > T1.iteration
    )

Или ...

SELECT
    T1.iteration AS maxiteration,
    T1.column
FROM
    Table T1
LEFT OUTER JOIN Table T2 ON
    T2.id = T1.id AND
    T2.iteration > T1.iteration
WHERE
    T1.id = 223652 AND
    T2.id IS NULL

Или ...

SELECT
    T1.iteration AS maxiteration,
    T1.column
FROM
    Table T1
INNER JOIN (SELECT id, MAX(iteration) AS maxiteration FROM Table T2 GROUP BY id) SQ ON
    SQ.id = T1.id AND
    SQ.maxiteration = T1.iteration
WHERE
    T1.id = 223652

РЕДАКТИРОВАТЬ: Я не увидел ошибку ORA при первом чтении вопроса, и она не была помечена как специфическая для Oracle. Я думаю, что могут быть некоторые различия в синтаксисе и использовании псевдонимов в Oracle, поэтому вам может потребоваться настроить некоторые из указанных выше запросов.

Ошибка Oracle говорит вам, что она не знает, что такое максимизация, потому что псевдоним столбца еще не доступен внутри подзапроса. Вы должны ссылаться на него по псевдониму таблицы и имени столбца, а не по псевдониму столбца, который я считаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...