Без использования явного оператора JOIN сделать подзапрос для нескольких таблиц в SQL?
Без использования явного оператора ПРИСОЕДИНЕНИЯ и дохода на душу населения в зоне сообщества, в которой показатель безопасности школы равен 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 inc. Вашингтон Парк
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
3 ответа
Попробуй это:
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' ;
UPDATE CENSUS_DATA SET COMMUNITY_AREA_NAME = UPPER(COMMUNITY_AREA_NAME)
выберите CD.PER_CAPITA_INCOME
с CD CENSUS_DATA,CHICAGO_PUBLIC_SCHOOLS CPS, где CD.COMMUNITY_AREA_NAME = CPS.COMMUNITY_AREA_NAME и CPS.SAFETY_SCORE = 1
Столбец CENSUS_DATA COMMUNITY_AREA_NAME имеет значения в нижнем регистре, а столбец CHICAGO_PUBLIC_SCHOOLS COMMUNITY_AREA_NAME имеет значения в верхнем регистре, поэтому лучше обновить конкретный столбец с помощью операции UPDATE и выполнить операцию запроса, чтобы получить требуемый ответ
Похоже, вы ищете неявное соединение, как это:
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'
Это сработало для меня.
%%sql
select CPS.COMMUNITY_AREA_NAME, CD.PER_CAPITA_INCOME, CPS.SAFETY_SCORE
from CENSUS_DATA CD, CHICAGO_PUBLIC_SCHOOLS CPS
where CD.COMMUNITY_AREA_NUMBER = CPS.COMMUNITY_AREA_NUMBER
and SAFETY_SCORE = 1;
Когда ваш ответ не должен содержать никакого соединения, вы должны использовать кросс-продукт, например, если у вас есть 2 таблицы, которые вы должны использовать select * from table1,table2 where condition
в вашем случае ответ должен быть
select PER_CAPITA_INCOME from school S,cencus_data C where C.COMMUNITY_AREA_NAME = S.COMMUNITY_AREA_NAME and S.SAFETY_SCORE=1
если он не работает, измените любой другой общий столбец между этими двумя таблицами
Я надеюсь, что это будет полезно
Проблема в том, что community_area_name в школах Чикаго - верхний регистр, а в данных переписи - нижний регистр, поэтому этот код работал со мной,
%sql выберите per_capita_income, community_area_number, community_area_name из CENUS_DATA, где community_area_number в (выберите community_area_number из SCHOOLS, где safety_score=1)
%sql select community_area_name, per_capita_income из census_data, где community_area_name='Вашингтонский парк';
Опция 1:
select PER_CAPITA_INCOME from CENSUS_DATA
where UPPER(COMMUNITY_AREA_NAME) = (
select COMMUNITY_AREA_NAME from CHICAGO_PUBLIC_SCHOOLS where SAFETY_SCORE = 1
);
Вариант 2:
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
)
Либо должно работать нормально.
Как прокомментировал @lau, вполне вероятно, что проблема, которую вы видите, связана с вашими данными.
Однако позвольте мне также отметить, что с этим условием есть скрытая проблема:
WHERE community_area_name =
(SELECT community_area_name FROM CHICAGO_PUBLIC_SCHOOLS where safety_score='1' )
Если более одной записи в CHICAGO_PUBLIC_SCHOOLS
существует с оценкой безопасности, равной 1, условие равенства не будет работать должным образом (в большинстве RDBMS это приводит к ошибке времени выполнения).
Это условие должно быть переписано, либо как 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'
)
Если вы изучаете курс "Базы данных и SQL для науки о данных" на Coursera. Проблема в наборах данных. Если вы посмотрите в csv данных переписи, название сообщества будет в нижнем регистре, а в школах - в верхнем регистре. Так что это должно помочь
%sql SELECT COMMUNITY_AREA_NAME, PER_CAPITA_INCOME \ FROM CENSUS_DATA \ WHERE UCASE(COMMUNITY_AREA_NAME) = (ВЫБЕРИТЕ "Community_Area_Name" FROM CHICAGO_PUBLIC_SCHOOLS WHERE "Safety_Score" = 1)
Я посмотрел на данные и, как все ожидали, я могу подтвердить, что есть проблема с вашими данными.
COMMUNITY_AREA_NAME
в верхнем регистре CHICAGO_PUBLIC_SCHOOL Это правильный регистр в CENSUS_DATA.
Строка в нижнем регистре всегда отличается от строки UPPERCASE, и они оба отличаются от строки Propercase.
Правильное решение, вероятно, состоит в том, чтобы проверить дизайн вашей базы данных и поместить куда-нибудь внешний ключ. У нас нет достаточно деталей, чтобы помочь в этом.
Менее правильный, например, установить все в надлежащий регистр и повторно запустить исправленный 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' )
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 )
%%sql select per_capita_income from CENSUS
where community_area_number = (select community_area_number from SCHOOLS where safety_score = 1)
- удалить
'
со всего'1'