Нужна помощь с сложным запросом SQL - PullRequest
3 голосов
/ 26 августа 2011

У меня есть запрос, который в настоящее время я получаю ORA-01427: однострочный подзапрос возвращает более одной ошибки строки.Я понимаю ошибку и ее причину, но не могу найти способ ее исправить.Я также хотел бы сделать это только в одном запросе.Вот что у меня в данный момент есть:

SELECT   v1.internal_code,
       (SELECT   terms_id
          FROM   terms
         WHERE   term_start_date =
                    (SELECT   MIN (term_start_date)
                       FROM   terms
                      WHERE   terms_id LIKE '%SU'
                              AND term_start_date >
                                    (SELECT   term_start_date
                                       FROM      terms
                                              JOIN
                                                 vals
                                              ON terms_id =
                                                    internal_code
                                      WHERE   internal_code =
                                                 v1.internal_code
                                              AND valcode_id =
                                                    'TERMS')))
          AS mmTerm
FROM      terms
       JOIN
          vals v1
       ON terms_id = internal_code
  WHERE   internal_code LIKE '%SP' AND valcode_id = 'WEB.SEARCH.TERMS'
 ORDER BY   mmTerm ASC

И соответствующая часть таблицы vals была бы такой:оканчиваются на «SU», где term_start_date больше, чем term_start_date терминов в таблице vals.Итак, желаемый результат:

v1.internal_code      mmTerm
----------------      ------
    2003SP            2003SU
    2004SP            2004SU
    2005SP            2005SU

Я знаю, что это сложно понять, поэтому, пожалуйста, задавайте вопросы, если таковые имеются.Также любые предложения с радостью принимаются.Спасибо!

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

Ответы [ 3 ]

1 голос
/ 26 августа 2011

Проблема в подзапросе, который используется здесь: AND term_start_date > ...

Должно возвращать одно значение. Лучшее решение, я думаю, это использовать MAX():

AND term_start_date >
    (SELECT MAX(term_start_date) -- USE MAX HERE
    FROM terms
    JOIN vals
    ON terms_id = internal_code
    WHERE internal_code = v1.internal_code
    AND valcode_id = 'TERMS')

Использование MAX() означает, что term_start_date должно быть больше, чем все term_start_date, найденные в подзапросе).

Если вам нужно, чтобы оно было больше любого , вместо этого используйте MIN().

EDITED Клянусь, вы отредактировали исходный запрос! В любом случае, попробуйте использовать агрегат для внешнего выбора, например:

SELECT   v1.internal_code,
   (SELECT   MAX(terms_id)
      FROM   terms
      ...
0 голосов
/ 26 августа 2011

Это довольно сложно прочитать - вам нужно добавить псевдонимы для всех ссылок на таблицы. Ошибка может быть получена, если вам не важно, какую строку возвращает подзапрос - просто верните MIN (term_id) или MAX (term_id) или что угодно, чтобы вернуть только 1 строку. Но вам, возможно, придется подумать о своих данных более глубоко - действительно ли имеет значение, какой термин возвращает подзапрос?

SELECT   v1.internal_code,
       (SELECT   MIN(terms_id)
          FROM   terms
         WHERE   term_start_date =
                    (SELECT   MIN (term_start_date)
                       FROM   terms
                      WHERE   terms_id LIKE '%SU'
                              AND term_start_date >
                                    (SELECT   term_start_date
                                       FROM      terms
                                              JOIN
                                                 vals
                                              ON terms_id =
                                                    internal_code
                                      WHERE   internal_code =
                                                 v1.internal_code
                                              AND valcode_id =
                                                    'TERMS')))
          AS mmTerm
FROM      terms
       JOIN
          vals v1
       ON terms_id = internal_code
  WHERE   internal_code LIKE '%SP' AND valcode_id = 'WEB.SEARCH.TERMS'
 ORDER BY   mmTerm ASC
0 голосов
/ 26 августа 2011

Ожидаете ли вы, что только одна запись соответствует условиям подзапроса? Чем вы должны добавить TOP 1 в свой подзапрос:

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