Без использования явного оператора JOIN сделать многотабличный подзапрос в SQL? - PullRequest
0 голосов
/ 31 января 2019

Без использования явного оператора ПРИСОЕДИНЕНИЯ и дохода на душу населения в зоне сообщества, в которой школьный показатель безопасности равен 1.

    SELECT per_capita_income,community_area_name
    FROM CENSUS_DATA
    where community_area_name =
        (SELECT community_area_name FROM CHICAGO_PUBLIC_SCHOOLS where safety_score='1' )

, ответ - "per_capita_income", "community_area_name", значения не существует ???Спасибо всем за все ответы ниже, но результат не изменился, никакого значения, однако я попытался:

 SELECT community_area_name FROM CHICAGO_PUBLIC_SCHOOLS 
where safety_score='1' 

и получил результат как 'WASHINGTON PARK' и сделал следующий запрос как

SELECT per_capita_income,community_area_name FROM CENSUS_DATA 
where community_area_name = 'WASHINGTON PARK'

У меня снова;per_capita_income community_area_name

Я проверил код ниже, чтобы подтвердить и получить все значения per_capita_income вкл.Вашингтон Парк

SELECT per_capita_income,community_area_name FROM CENSUS_DATA

так что, наконец, я не смог получить значение capita_income.Данные находятся по ссылкам ниже

CENSUS_DATA:

https://ibm.box.com/shared/static/05c3415cbfbtfnr2fx4atenb2sd361ze.csv

CHICAGO_PUBLIC_SCHOOLS

https://ibm.box.com/shared/static/f9gjvj1gjmxxzycdhplzt01qtz0s7ew7.csv

CHICAGO_CRIME_DATA:

https://ibm.box.com/shared/static/svflyugsr9zbqy5bmowgswqemfpm1x7f.csv

Ответы [ 6 ]

0 голосов
/ 10 июня 2019

попробуйте это:

SELECT c.per_capita_income, c.community_area_name
    FROM CENSUS_DATA c, CHICAGO_PUBLIC_SCHOOLS s 
    WHERE s.COMMUNITY_AREA_NUMBER  = c.COMMUNITY_AREA_NUMBER AND s.SAFETY_SCORE = '1' ;
0 голосов
/ 28 марта 2019
UPDATE CENSUS_DATA SET COMMUNITY_AREA_NAME = UPPER(COMMUNITY_AREA_NAME)  
select  CD.PER_CAPITA_INCOME  
from CENSUS_DATA CD,CHICAGO_PUBLIC_SCHOOLS CPS 
where CD.COMMUNITY_AREA_NAME = CPS.COMMUNITY_AREA_NAME 
and CPS.SAFETY_SCORE = 1

Столбец CENSUS_DATA COMMUNITY_AREA_NAME имеет значения в нижнем регистре, а для столбца CHICAGO_PUBLIC_SCHOOLS COMMUNITY_AREA_NAME - в верхнем регистре, поэтому лучше обновить конкретный столбец с помощью операции UPDATE и выполнить операцию запроса, чтобы получить требуемый ответ

0 голосов
/ 10 марта 2019
SELECT per_capita_income FROM CENSUS_DATA WHERE upper(community_area_name) IN 
(SELECT "Community_Area_Name" FROM CHICAGO_PUBLIC_SCHOOLS WHERE "Safety_Score" = 1 )
0 голосов
/ 31 января 2019

Я посмотрел на данные и, как все ожидали, могу подтвердить, что с вашими данными есть проблема.

COMMUNITY_AREA_NAME в верхнем регистре CHICAGO_PUBLIC_SCHOOL Это правильный регистр в CENSUS_DATA.

Строка в нижнем регистре всегда отличается от строки UPPERCASE, и они оба отличаются от строки, которая является Propercase.

Правильное решение, вероятно, заключается в рассмотрении вашей базы данных и установкевнешний ключ где-то.У нас недостаточно подробностей, чтобы помочь с такими вещами.

Правило less , например, устанавливает все в правильный регистр и повторно запускает исправленный SELECT.

UPDATE CENSUS_DATA SET community_area_name = INITCAP(community_area_name);
UPDATE CHICAGO_PUBLIC_SCHOOLS  SET community_area_name = INITCAP(community_area_name);


SELECT per_capita_income,community_area_name
    FROM CENSUS_DATA
    where community_area_name IN
        (SELECT community_area_name FROM CHICAGO_PUBLIC_SCHOOLS where safety_score='1' )
0 голосов
/ 31 января 2019

Как прокомментировал @lau, вполне вероятно, что проблема, которую вы видите, связана с вашими данными.

Однако позвольте мне также отметить, что существует скрытая проблема с этим условием:

WHERE community_area_name =
    (SELECT community_area_name FROM CHICAGO_PUBLIC_SCHOOLS where safety_score='1' )

Если существует более одной записи в CHICAGO_PUBLIC_SCHOOLS с показателем безопасности, равным 1,условие равенства не будет работать должным образом (в большинстве СУБД это приводит к ошибке времени выполнения).

Это условие следует переписать либо как IN условие:

SELECT per_capita_income,community_area_name
FROM CENSUS_DATA
WHERE community_area_name IN
    (SELECT community_area_name FROM CHICAGO_PUBLIC_SCHOOLS where safety_score='1' )

, либо каккоррелированный подзапрос с условием EXIST:

SELECT c.per_capita_income, c.community_area_name
FROM CENSUS_DATA c
WHERE EXISTS (
    SELECT 1 
    FROM CHICAGO_PUBLIC_SCHOOLS s
    WHERE s.community_area_name  = c.community_area_name AND s.safety_score = '1' 
)
0 голосов
/ 31 января 2019

Похоже, вы ищете неявное соединение, как это:

SELECT cd.per_capita_income,cd.community_area_name
FROM CENSUS_DATA as cd, CHICAGO_PUBLIC_SCHOOLS as cps
where cd.community_area_name = cps.community_area_name 
AND cps.safety_score='1' 
...