sorry, not enough reputation to post images. I have 3 SQL tables:
x1: {'a':1,2,3,4,5},
x2: {'c':1,1,1,2,2,3,3, 'd':1,3,5,1,3,1,1},
x3: {'b':1,3,5}
The query is:
select a from x1
where not exists (
select * from x3
where not exists (
select *
from x2
where x1.a = x2.c and x3.b=x2.d
)
)
The result from the following query is '1', but I can't understand what are the steps taken to get to that result.
What is being returned in which subquery?
CodePudding user response:
In a sentence, your query is looking for values of a
in x1
that exist as a left member of the couples (c, d)
in x2
for every single value of b
from x3
as right member. In this case when you take a = 1
, you have all three couples (1, 1)
, (1, 3)
and (1, 5)
in x2
.
Step by step: outer query goes through each a
from x1
. For each a
, inner subquery (inside first where not exists
) goes through each b
from x3
. Innermost subquery compares the selected couple (a, b)
against all couples (c, d)
in x2
. If there is no occurence of this (a, b)
in x2
, then a
is not returned. Basically: give me each a
for which there doesn't exist a b
, for which (a, b)
is not in x3 <-> give me each a
where (a, b)
exists in x2
for every single b
from x3
.
CodePudding user response:
I will try to explain. Your query will fetch records from table a for which the result set of
is empty(ie is asserted by not exists)
Consider the data in the tables
The values in a are 1,2,3,45
Lets check for a=1
We got against a=1 with c=1 three records in Table x2
And for the 3 records all of the column d values are present in table x3. This means the output of the block will return empty for a=1 and therefore will be present in the final output.
Check for a=2, the possible values in d are 1 and 3 and as we got 5 in table x3 the query will return a non-empty result
Similarly for a=3 the inner query returns 3 and 5 from table x3
For a=45, as a doesnt exist in table x2,all of the records table x3 gets returned -> 1,3,5
Therefore the only a which satisfy the empty result set is a=1 which is the answer.