不使用显式的JOIN运算符在SQL中进行多表子查询?

时间:2019-01-30 22:53:58

标签: sql subquery multi-table

不使用显式的JOIN运算符,将学校安全得分为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

13 个答案:

答案 0 :(得分:0)

您似乎正在寻找这样的隐式联接:

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' 

答案 1 :(得分:0)

如@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' 
)

答案 2 :(得分:0)

我已经查看了数据,并且正如每个人所期望的,我可以确认您的数据有问题。

COMMUNITY_AREA_NAME在CHICAGO_PUBLIC_SCHOOL中为大写 在CENSUS_DATA中是适当的情况。

小写的字符串与大写的字符串始终不同,并且两者都与大写的字符串不同。

正确的解决方案可能是检查数据库设计并将外键放在某个地方。我们没有足够的细节来帮助解决此类问题。

例如,较少的所有内容均设置为大写并重新运行已更正的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' )

答案 3 :(得分:0)

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 )

答案 4 :(得分:0)

UPDATE CENSUS_DATA SET COMMUNITY_AREA_NAME = UPPER(COMMUNITY_AREA_NAME)
选择CD.PER_CAPITA_INCOME
来自CENSUS_DATA CD,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操作更新特定列并执行查询操作以获得所需答案

答案 5 :(得分:0)

尝试这个:

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' ;

答案 6 :(得分:0)

您的答案何时不应该包含任何联接,您必须使用叉积,例如,如果您有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

如果不起作用,请更改这两个表之间的任何其他公共列

我希望对您有帮助

答案 7 :(得分:0)

选项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
)

任何一个都可以正常工作。

答案 8 :(得分:0)

如果要在Coursera上进行“数据科学的数据库和SQL”课程。问题出在数据集中。如果您查看人口普查数据csv,则社区名称使用小写字母,而在学校中,csv使用大写字母。所以这应该可以解决问题

%sql SELECT COMMUNITY_AREA_NAME,PER_CAPITA_INCOME \ 来自CENSUS_DATA \ 哪里UCASE(COMMUNITY_AREA_NAME)=(从CHICAGO_PUBLIC_SCHOOLS那里选择“ Community_Area_Name”,其中“ Safety_Score” = 1)

答案 9 :(得分:0)

%sql从人口普查数据中选择community_area_name,per_capita_income,其中community_area_name ='华盛顿公园';

答案 10 :(得分:0)

这对我有用。

%%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;

答案 11 :(得分:0)

问题是芝加哥学校的community_area_name为大写,而人口普查数据为小写 所以这段代码对我有用,

%sql从CENUS_DATA中选择per_capita_income,community_area_number,community_area_name,其中community_area_number进入(从SCHOOLS中选择safety_score = 1的community_area_number)

答案 12 :(得分:-1)

import matplotlib.pyplot as plt

to_utility = [-3.4000000000000004, -2.6999999999999993, -0.9000000000000004, 1.8000000000000007, -1.0999999999999996,
              -1.6999999999999993, 0.6999999999999993, 5.300000000000001, 0.1999999999999993, 2.3999999999999986, 2.5,
              1.3999999999999986, -3.6999999999999993, -8.8, -6.600000000000001, -9.600000000000001, -11,
              -7.800000000000001, -8.4, -8.9, -11.7, -7.300000000000001, -8.9, -4.9]

shifted = 6.652632153034208

curve_max = max(to_utility)
curve_min = min(to_utility)

upper_shift_line = [curve_max - shifted] * len(to_utility)
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.set_title('To Utility Curve')
ax1.set_ylim([curve_min, curve_max])
ax1.plot(range(len(to_utility)), to_utility, upper_shift_line)
ax1.fill_between(range(len(to_utility)), to_utility, upper_shift_line, where=to_utility > upper_shift_line,
                 interpolate=True)
plt.show()
  • %%sql select per_capita_income from CENSUS where community_area_number = (select community_area_number from SCHOOLS where safety_score = 1) 附近删除'