Объединить два выбора - PullRequest
       3

Объединить два выбора

0 голосов
/ 17 октября 2019

У меня проблема с двумя запросами sql. Один sql выбирает несколько идентификаторов, а другой устанавливает структуру id. Проблема в том, что я не могу заставить их оба работать как один запрос.

SQL, который задает структуру:

select nstrid 
from t_ousernstr 
where kstrid = 116 And 
Bis is null
Order by nstrid

Идентификаторы этого типа:

100
200
300
400

И SQL, который получает идентификаторы пользователя:

SELECT
    T_OUSER.ID                                      AS ID,
    FROM
    T_OUSER,
    T_OUSERNSTR
    WHERE 
            ( T_OUSERNSTR.NSTRID = ANY(//here should be the id's from above))
            (T_OUSERNSTR.VON is null or SYSDATE >=T_OUSERNSTR.VON) and
            (T_OUSERNSTR.BIS is null) and
            (T_OUSERNSTR.BEGINN IS NULL OR T_OUSERNSTR.BEGINN<= SYSDATE) and
            (T_OUSERNSTR.ENDE is null or T_OUSERNSTR.ENDE> SYSDATE)                                 
    Order By T_OUSER.ID;

1 Ответ

1 голос
/ 17 октября 2019

Используйте IN:

SELECT o.ID AS ID
FROM   T_OUSER o
       CROSS JOIN
       T_OUSERNSTR n
WHERE  n.NSTRID IN ( select nstrid 
                     from   t_ousernstr 
                     where  kstrid = 116
                     And    Bis is null )
AND    ( n.BIS    IS NULL )
AND    ( n.VON    IS NULL OR SYSDATE >= n.VON    )
AND    ( n.BEGINN IS NULL OR SYSDATE >= n.BEGINN )
AND    ( n.ENDE   IS NULL OR SYSDATE <  n.ENDE   )                                 
ORDER BY o.ID;

или EXISTS:

SELECT o.ID AS ID
FROM   T_OUSER o
       CROSS JOIN
       T_OUSERNSTR n
WHERE  EXISTS (
         SELECT 1
         FROM   t_ousernstr x
         WHERE  x.kstrid = 116
         AND    x.Bis    IS NULL
         AND    ( n.NSTRID = x.NSTRID OR ( n.NSTRID IS NULL AND x.NSTRID IS NULL ) )
       )
AND    ( n.BIS    IS NULL )
AND    ( n.VON    IS NULL OR SYSDATE >= n.VON    )
AND    ( n.BEGINN IS NULL OR SYSDATE >= n.BEGINN )
AND    ( n.ENDE   IS NULL OR SYSDATE <  n.ENDE   )                                 
ORDER BY o.ID;

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

SELECT o.ID AS ID
FROM   T_OUSER o
       CROSS JOIN
       ( SELECT n.*,
                MAX( CASE WHEN kstrid = 116 THEN 1 ELSE 0 END )
                  OVER ( PARTITION BY bis, nstrid )
                  AS has_kstrid
         FROM   T_OUSERNSTR n
       ) n
WHERE  n.has_kstrid = 1
AND    ( n.BIS    IS NULL )
AND    ( n.VON    IS NULL OR SYSDATE >= n.VON    )
AND    ( n.BEGINN IS NULL OR SYSDATE >= n.BEGINN )
AND    ( n.ENDE   IS NULL OR SYSDATE <  n.ENDE   )                                 
ORDER BY o.ID;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...