SQL练习-隐式联接

SQL练习-隐式联接,sql,db2,Sql,Db2,各位下午好, 我是一个初学者,试图解决一个练习,但不明白为什么结果我只得到标题 我正在使用IBMDB2 考虑两个表: CHICAGO_PUBLIC_SCHOOLS: (COMMUNITY_AREA_NAME | SAFETY_SCORE) CENSUS_DATA: (COMMUNITY_AREA_NAME | PER_CAPITA_INCOME) 练习: [不使用明确的联接运算符]查找安全得分为1的社区区域的人均收入 我的代码: SELECT COMMUNITY_AREA_NAME, PER

各位下午好,

我是一个初学者,试图解决一个练习,但不明白为什么结果我只得到标题

我正在使用IBMDB2

考虑两个表:

CHICAGO_PUBLIC_SCHOOLS: (COMMUNITY_AREA_NAME | SAFETY_SCORE)

CENSUS_DATA: (COMMUNITY_AREA_NAME | PER_CAPITA_INCOME)
练习: [不使用明确的联接运算符]查找安全得分为1的社区区域的人均收入

我的代码:

SELECT COMMUNITY_AREA_NAME, PER_CAPITA_INCOME 

FROM CENSUS_DATA 

where COMMUNITY_AREA_NAME IN
            (SELECT  COMMUNITY_AREA_NAME FROM CHICAGO_PUBLIC_SCHOOLS
                WHERE SAFETY_SCORE=1)
非常感谢能帮助我理解的人

编辑: 基于我收到的前两条评论的一点补充,希望这可能会有所帮助。安全评分不应成为问题,因为以下代码工作正常:

从芝加哥公立学校中选择社区\地区\名称
首先,如果SAFETY_SCORE=1,则应限定具有多个表引用的任何查询中的所有列名:

SELECT cd.COMMUNITY_AREA_NAME, cd.PER_CAPITA_INCOME 
FROM CENSUS_DATA cd
WHERE cd.COMMUNITY_AREA_NAME IN
            (SELECT cps.COMMUNITY_AREA_NAME
             FROM CHICAGO_PUBLIC_SCHOOLS cps
             WHERE cps.SAFETY_SCORE = 1
            );
我可以很容易地想到以下几种可能性来解释为什么此查询不会返回任何行:

两个表都没有行。 芝加哥公立学校没有与安全分数=1匹配的行。 任何SAFETY_SCORE=1的行的区域名称都不在普查表中。 社区\区域\名称在两个表之间不匹配。 您没有提供示例数据或小提琴。以下是调试的一些想法:

对于第一种可能性,在两个表上运行COUNT*

对于第二个问题,只需运行子查询,查看它是否返回任何行

对于第三个,运行子查询并手动检查表中的名称是否匹配


对于第四,您必须考虑看起来相同但不同的字符串——通常是因为隐藏字符。

您的解决方案对我来说很好。也许在芝加哥公立学校中没有安全分数为1的行?你好,Thorsten,我在单独的查询中进行了检查,我可以确认在Excel中也手动进行了检查。你确定安全分数是数字数据类型吗?如果它是字符串数据类型,则该条件永远不会为真,至少在大多数DBMS中是这样。免责声明:我从未使用过IBM Db2,但我假设在本例中,它与其他DBMS非常相似。嗨,David,我刚刚编辑了我的消息=如果我只运行查询的第二部分,代码工作正常Hello Gordon,感谢您的回复。我认为问题一定是芝加哥公立学校的结果是“华盛顿公园”,而人口普查的结果是“华盛顿公园”。我正在尝试使用LCASE,但我担心我在语法上弄错了什么,你能建议一下吗?谢谢@巴尔德萨罗。如果这是唯一的问题,那么:在LCASEcd.COMMUNITY\u AREA\u NAME中选择LCASEcps.COMMUNITY\u AREA\u NAME。应该有用。