这个多标准WHERE语句有什么问题?

时间:2011-08-15 17:26:55

标签: sql sql-server

下面的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表。

4 个答案:

答案 0 :(得分:1)

也许FEATURESCountyFEATURESState之间的联接排除了您希望看到的结果?尝试将其更改为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.

问题是您应该加入CountyState而不是CountyFEATURES吗?例如:

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_NUMERICFeatures.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)