/ / zewnętrzna kolumna zapytania w wewnętrznym wyrażeniu przypadku zapytania - mysql, sql, baza danych, vertica

zewnętrzna kolumna zapytania w wewnętrznym zapytaniu o zapytanie - mysql, sql, database, vertica

Próbuję napisać poniższe zapytanie w vertica

`SELECT a.*
FROM   a
WHERE  a.country="India"
AND    a.language ="Hindi"
AND   ( CASE WHEN (a.spoken = true
AND exist ( select 1
FROM   b
WHERE  b.country=a.country
AND    b.language=a.language
AND   ( CASE WHEN (a.population <b.population
AND    a.statsyear > b.statsyear))
THEN true //pick recent stats
WHEN (a.population > b.population)
THEN true
ELSE false
END)) THEN true
WHEN (a.written = true ) THEN
true
ELSE false
END)`

nie działa, ponieważ nie możemy „odwoływać się” do zewnętrznego pola zapytania a. populacja w przypadku wyrażenia zapytania wewnętrznego. Próbowałem go przepisać, LUB OR caluse Vertica na to nie pozwala.

Jak mogę to ponownie napisać?

Utworzyłem poniższe tabele w lokalnym polu MySQL

 Example of Tables and Results
CREATE TABLE tableA
(
id          INT,
country     VARCHAR(20),
language    VARCHAR(20),
spoken      INT,
written     INT,
population  INT,
stats       INT
)
insert into tableA values(1,"India","Hindi",1,0,9,2010)
insert into tableA values(2,"India","Hindi",1,0,11,2011)
insert into tableA values(3,"India","Hindi",1,0,10,2012)
insert into tableA values(4,"India","Hindi",0,1,10,2013)
insert into tableA values(5,"India","Hindi",1,1,10,2012)
insert into tableA values(6,"India","English",1,1,10,2012)
CREATE TABLE tableB
(
id          INT,
country     VARCHAR(20),
language    VARCHAR(20),
population  INT,
stats       INT
)
insert into TableB values(1,"India","Hindi",10,2009)
insert into TableB values(2,"India","Hindi",10,2011)
insert into TableB values(3,"India","Hindi",10,2012)

Rewrote the query slightly in different way

select distinct a.id
from (
SELECT a.*
FROM   TableA a
WHERE  a.country="India"
AND    a.language ="Hindi" ) a, TableB   b
WHere ( CASE WHEN a.written=1 THEN
TRUE
WHEN ( (a.spoken = 1) AND (a.country=b.country) AND (a.language=b.language)) THEN
(case WHEN ((a.population < b.population) AND (a.stats > b.stats)) THEN
TRUE
WHEN (a.population > b.population) THEN
TRUE
ELSE
FALSE
END)
ELSE
FALSE
END)
got below results
1,2,4,5

To jest to, czego potrzebuję, czy mógłbyś mi teraz pomóc w napisaniu tego bardziej efektywnie

Odpowiedzi:

0 dla odpowiedzi № 1

Logiczny odpowiednik logiczny:

SELECT DISTINCT a.*
FROM   TableA a
left join TableB b on a.country=b.country AND a.language=b.language
WHERE  a.country="India"
AND    a.language ="Hindi"
AND (
a.written=1
OR
(a.spoken = 1 AND a.population < b.population AND a.stats > b.stats)
OR
a.population > b.population
)
;

Wynik:

+----+---------+----------+--------+---------+------------+-------+
| id | country | language | spoken | written | population | stats |
+----+---------+----------+--------+---------+------------+-------+
|  1 | India   | Hindi    |      1 |       0 |          9 |  2010 |
|  2 | India   | Hindi    |      1 |       0 |         11 |  2011 |
|  4 | India   | Hindi    |      0 |       1 |         10 |  2013 |
|  5 | India   | Hindi    |      1 |       1 |         10 |  2012 |
+----+---------+----------+--------+---------+------------+-------+

Próbny