Как выполнить подзапрос в Oracle?Мой запрос получает круглые скобки - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь выполнить запрос внутри LabVIEW, чтобы получить информацию, хранящуюся в базе данных Oracle, но при попытке выполнить запрос с круглыми скобками это не работает и выдает мне следующее сообщение об ошибке:

Ошибка ADO: 0x80004005 Исключительная ситуация в поставщике Microsoft OLE DB для драйверов ODBC: [Oracle] [ODBC] [Ora] ORA-00907: Partentese direito não encontrado

Вот SQL-запрос Iпытаюсь выполнить:

SELECT
F.CODIGOFAIXAMODELO,
F.CODIGOMODELO,
F.INICIOESCALA,
F.FUNDOESCALA,
F.FAIXA,
F.DESCFAIXA,
F.ORDEM,
P.CODIGOPROCEDIMENTO
FROM FAIXAS F INNER JOIN PROCEDS P ON F.CODIGOFAIXAMODELO=(
    SELECT
    CODIGOFAIXAMODELO
    FROM PROCEDS
    WHERE
    PROCEDS.CODIGOFAIXAMODELO=F.CODIGOFAIXAMODELO
    LIMIT 1
    )
WHERE
F.CODIGOMODELO='%CODIGOMODELO%'
ORDER BY F.ORDEM ASC;

%CODIGOMODELO% заменяется значением LabVIEW.

Когда я пытаюсь выполнить следующий запрос, он работает:

SELECT
F.CODIGOFAIXAMODELO,
F.CODIGOMODELO,
F.INICIOESCALA,
F.FUNDOESCALA,
F.FAIXA,
F.DESCFAIXA,
F.ORDEM,
P.CODIGOPROCEDIMENTO
FROM FAIXAS F INNER JOIN PROCEDS P ON F.CODIGOFAIXAMODELO=P.CODIGOFAIXAMODELO
WHERE
F.CODIGOMODELO='%CODIGOMODELO%'
ORDER BY F.ORDEM ASC;

Проблема со вторым решением заключается в том, что он возвращает мне много P.CODIGOPROCEDIMENTO, и я хочу получить только один, даже если их много.

Ответы [ 3 ]

0 голосов
/ 08 февраля 2019

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

SELECT
F.CODIGOFAIXAMODELO,
F.CODIGOMODELO,
F.INICIOESCALA,
F.FUNDOESCALA,
F.FAIXA,
F.DESCFAIXA,
F.ORDEM,
P.CODIGOPROCEDIMENTO
FROM FAIXAS F
INNER JOIN (
                SELECT
                P1.CODIGOFAIXAMODELO,
                MAX(P1.CODIGOPROCEDIMENTO) AS CODIGOPROCEDIMENTO
                FROM PROCEDS P1
                GROUP BY P1.CODIGOFAIXAMODELO
           ) P ON P.CODIGOFAIXAMODELO = F.CODIGOFAIXAMODELO
WHERE F.CODIGOMODELO = '%CODIGOMODELO%'
ORDER BY F.ORDEM ASC;

MAX() - это Агрегатная функция , которая будет возвращать только одно значение для каждой группы - указано в предложении GROUP BY.Следовательно, использование подзапроса и присоединение к CODIGOFAIXAMODELO гарантирует, что только одна строка будет отфильтрована по основному запросу.Результаты действительно зависят от ключевых структур, типов данных и количества строк, доступных в PROCEDS.Конечно, есть и другие, более сложные методы для достижения того же результата, например, использование Аналитические функции .

0 голосов
/ 08 февраля 2019

Я думаю, вы можете написать это так:

SELECT
F.CODIGOFAIXAMODELO,
F.CODIGOMODELO,
F.INICIOESCALA,
F.FUNDOESCALA,
F.FAIXA,
F.DESCFAIXA,
F.ORDEM,
P.CODIGOPROCEDIMENTO
FROM FAIXAS F INNER JOIN PROCEDS P ON F.CODIGOFAIXAMODELO=P.CODIGOFAIXAMODELO and ROWNUM = 1
WHERE
F.CODIGOMODELO='%CODIGOMODELO%'
ORDER BY F.ORDEM ASC;
0 голосов
/ 07 февраля 2019

в Oracle нет функции LIMIT

, вам нужно использовать ROWNUM = 1 или OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY

Также, как указано @APC, вам не следует присоединятьсяваш стол в подзапросе.

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