Reputation: 167
I have a problem with two sql querys. The one sql selects some ID's and the other one sets the id structur. The problem is I can't get them both to work as one query.
The SQL which sets the structure:
select nstrid
from t_ousernstr
where kstrid = 116 And
Bis is null
Order by nstrid
The id's from that are like:
100
200
300
400
And the SQL which gets the user id's:
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;
Upvotes: 0
Views: 70
Reputation: 167972
Use 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;
or 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;
or to remove the correlated sub-query you could use analytic functions:
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;
Upvotes: 1