SQL IN "Слишком много значений" - PullRequest
0 голосов
/ 07 февраля 2020

У меня проблема, я хочу получить все DISTINCT CLIENTID в моей таблице LCMINV, в которой CLIENTID находится в CLAENTID LAAPPL и COBORWID * LACOBORW , а также STATUS APPLATION это либо 'PEN' ИЛИ 'RE C' .

Вот моя таблица:

++++++++++++++++++++++++++++++++++++++++++++
+   LAAPPL     +  LACOBORW   +  LCMINV     +
++++++++++++++++++++++++++++++++++++++++++++
+   CLIENTID   +   APPLNO    +  CLIENTID   +
+   APPLNO     +   COBORWID  +             +
+   STATUS     +             +             +
++++++++++++++++++++++++++++++++++++++++++++

Вот мой SQL запрос, который я сделал до сих пор:

SELECT DISTINCT(CLIENTID) 
FROM LCMINV 
WHERE CLIENTID 
IN (SELECT CLIENTID, COBORWID 
FROM LAAPPL 
LEFT OUTER JOIN LACOBORW ON LACOBORW.APPLNO = LAAPPL.APPLNO 
WHERE STATUS = 'PEN' OR STATUS = 'REC')

Можно ли это сделать одним запросом или мне нужны отдельные запросы? Я пробовал свой запрос выше, и я получаю сообщение об ошибке "Слишком много значений"

Ответы [ 3 ]

0 голосов
/ 07 февраля 2020

Я думаю, вы просто хотите:

SELECT DISTINCT i.CLIENTID 
FROM LCMINV i
WHERE i.CLIENTID IN (SELECT a.CLIENTID 
                     FROM LAAPPL a JOIN 
                          LACOBORW c
                          ON c.APPLNO = a.APPLNO 
                     WHERE a.STATUS IN ('PEN', 'REC')
                    );

Я не совсем уверен, почему вы присоединяетесь к LACOBORW. Вы, вероятно, можете удалить эту логику c.

0 голосов
/ 07 февраля 2020

Я бы порекомендовал левые соединения, чтобы получить необходимые данные. К сожалению, ваш вопрос 3 не соответствует вашей модели, потому что ваша таблица LCMINV не имеет идентификатора, соответствующего другой таблице, и я не могу понять, где должен быть LCMINV.CLIENTID связано с в другом контексте. Это работает в MS SQL - не может быть уверен насчет Oracle.

--this statement will give you all the names that have a status in the where clause
--you will receive NULL if there is no Co-BorrowerID
select
    a.name
  , b.applno
  , b.status
  , c.coborwid  
from
  lcclient a left join
  laapl b    on a.clientid = b.clientid left join
  lacoborw c on b.applno   = c.applno   
where 
  b.status in ('PEN', 'REC')
order by
  a.name
0 голосов
/ 07 февраля 2020

Я бы, вероятно, использовал бы CTE, чтобы разбить запрос на более мелкие части, а затем использовал бы INNER JOINs, чтобы объединить таблицы. Поскольку вы запрашиваете LAAPPL, я помещаю оба используемых столбца в один подзапрос, а затем присоединяюсь к каждому столбцу в следующем CTE.

Это будет выглядеть примерно так:

WITH CTE_LAAPPL AS
(
    SELECT 
        CLIENTID
        ,APPLNO
    FROM LAAPPL
    WHERE STATUS IN ('PEN','REC')
)
,CLIENTIDs AS
(
    SELECT DISTINCT
        l.COBORWID AS CLIENTID
    FROM CTE_LAAPPL c
    INNER JOIN LACOBORW l ON l.APPLNO = c.APPLNO

    UNION

    SELECT DISTINCT
        l.CLIENTID
    FROM CTE_LAAPPL c
    INNER JOIN LCMINV l ON l.CLIENTID = c.CLIENTID    
)
SELECT 
    c.CLIENTID
    ,c.NAME
FROM LCCLIENT c
INNER JOIN CLIENTIDs i ON i.CLIENTID = c.CLIENTID
ORDER BY NAME
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...