下面的SQL不会返回正确的结果。但是,当我手动查询State表中的'STATEFP = 6'并将该结果的PK插入到County表的查询中(WHERE stateid = 2004 AND countyfp = 45)时,我得到了所需的结果。
SELECT * FROM Features
INNER JOIN County ON Features.COUNTY_NUMERIC = County.COUNTYFP
INNER JOIN State ON Features.STATE_NUMERIC = State.STATEFP
WHERE (County.COUNTYFP = 45) AND (State.STATEFP = 6)
回归的县似乎是第一个匹配的县。例如,每个州都有一个countyfp = 100的县。看来这个sql正在抓住它找到的前100个并且不考虑状态。必须考虑到国家。
我在这里做错了什么?
功能表有一列,CountyId。该列将我们链接到县表。 County表有一个StateId列,它将我们链接回State表。
答案 0 :(得分:1)
也许FEATURES
和County
或FEATURES
和State
之间的联接排除了您希望看到的结果?尝试将其更改为left join
并查看是否获得预期结果:
SELECT * FROM Features
LEFT JOIN County ON Features.COUNTY_NUMERIC = County.COUNTYFP
LEFT JOIN State ON Features.STATE_NUMERIC = State.STATEFP
WHERE (County.COUNTYFP = 45) AND (State.STATEFP = 6)
更新:
根据您的更新 - The County table has a column StateId that links us back to the State table.
问题是您应该加入County
和State
而不是County
和FEATURES
吗?例如:
SELECT * FROM Features
INNER JOIN County ON Features.COUNTY_NUMERIC = County.COUNTYFP
INNER JOIN State ON County.STATE_NUMERIC = State.STATEFP
WHERE (County.COUNTYFP = 45) AND (State.STATEFP = 6)
答案 1 :(得分:0)
听起来像郡和州中存在正确的记录,但不是特征。这会返回任何行吗?
SELECT * FROM Features
WHERE (COUNTY_NUMERIC = 45) AND (STATE_NUMERIC = 6)
答案 2 :(得分:0)
在我看来,Features
中的所有行都没有正确填充Features.COUNTY_NUMERIC
和Features.STATE_NUMERIC
。
您能查看实际数据并验证吗?
如果是这种情况,那么值为NULL的行将显示在多个结果集中。
在这种情况下,清理数据比使用LEFT JOIN
编辑:列名
您是否加入了错误的列?您是否应该使用COUNTYID和STATEID而不是相应的FP列?
SELECT * FROM Features
INNER JOIN County ON Features.COUNTY_NUMERIC = County.COUNTYID
INNER JOIN State ON Features.STATE_NUMERIC = State.STATEID
WHERE (County.COUNTYFP = 45) AND (State.STATEFP = 6)
答案 3 :(得分:0)
但是,当我手动查询状态表中的'STATEFP = 6'时 将该结果的PK插入到County表的查询中(WHERE stateid = 2004 AND countyfp = 45) 。 。 。 看来这个sql正在抓住它找到的前100个而没有 关注国家。必须考虑到国家。
没有表格def,所以这是一个猜测,但看起来查询并不是按照手动方式缩小各州的状态。也许是这样的:
SELECT * FROM Features
INNER JOIN State ON Features.STATE_NUMERIC = State.STATEFP
INNER JOIN County
ON Features.COUNTY_NUMERIC = County.COUNTYFP
AND State.an_appropriate_column = county.an_appropriate_state_identifier
WHERE (County.COUNTYFP = 45) AND (State.STATEFP = 6)