Без использования явного оператора 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'
Другие вопросы по тегам