Reputation: 322
I have 3 tables:
Table A: id, name
Table B: id, name, date(Datetime)
Table C: idA, idB, flag(boolean)
For current I have a SQL:
SELECT A.* from A
WHERE (
A.name LIKE '%str%'
AND NOT (
A.id IN (
SELECT C.idA
FROM C
INNER JOIN B
ON ( C.idB = B.id )
WHERE B.name LIKE '%str2%'
AND C.flag = True
AND B.date >= '2016-10-20'
)
)
)
I want to divided condition WHERE same:
SELECT A.* from A
WHERE (
A.name LIKE '%str%'
AND NOT (
A.id IN (
SELECT C.idA
FROM C
INNER JOIN B
ON ( C.idB = B.id )
WHERE B.name LIKE '%str2%'
)
AND A.id IN(
SELECT C.idA
FROM C
WHERE C.flag = True
)
AND A.id IN(
SELECT C.idA
FROM C
INNER JOIN B
ON ( C.idB = B.id )
WHERE B.date >= '2016-10-20'
)
)
)
But it's not working fine. Please help me to divided condition. Thank you!
Upvotes: 1
Views: 93
Reputation: 31
This query will be return same result with your first query:
SELECT A.* from A
WHERE (
A.name LIKE '%str%'
AND NOT (
A.id IN (
SELECT C.idA from C
where C.id in(
SELECT C.id from C
WHERE (
C.id IN (
SELECT C.id
FROM C
INNER JOIN B
ON ( C.idB = B.id )
WHERE B.name LIKE '%str2%'
)
AND C.id IN(
SELECT C.id
FROM C
WHERE C.flag = True
)
AND A.id IN(
SELECT C.idA
FROM C
INNER JOIN B
ON ( C.idB = B.id )
WHERE B.date >= '2016-10-20'
)
)
)
)
)
)
Upvotes: 0
Reputation: 150
SELECT A.* from A
WHERE (A.name LIKE '%str%')
AND
(NOT (A.id IN (SELECT C.idA FROM C INNER JOIN B ON (C.idB = B.id) WHERE B.name LIKE '%str2%')))
AND
(A.id IN (SELECT C.idA FROM C WHERE C.flag = True))
AND
(A.id IN (SELECT C.idA FROM C INNER JOIN B ON (C.idB = B.id) WHERE B.date >= '2016-10-20'))
Upvotes: 1