我需要构建一个MSSQL查询,选择最匹配的一行。
- 理想情况下,我们有匹配的街道,邮政编码和门牌号。
- 只有在没有任何结果的情况下,只匹配街道和邮政编码就足够了
我有这个查询到目前为止:
SELECT TOP 1 * FROM realestates
WHERE
(Address_Street = '[Street]'
AND Address_ZipCode = '1200'
AND Address_Number = '160')
OR
(Address_Street = '[Street]'
AND Address_ZipCode = '1200')
MSSQL目前给我的结果是Address_Number不是160,所以似乎第二个子句(只有街道和zipcode必须匹配)优先于第一个。如果我切换两个OR子句,结果相同:)
我如何优先考虑第一个OR子句,以便MSSQL停止寻找其他结果,如果我们发现一个匹配的地方,三个字段都存在?
这里的问题不是WHERE
(尽管这是一个"问题"),而是缺乏ORDER BY
。你有一个TOP (1)
,但是你没有任何东西告诉数据引擎哪一行是"顶"行;行,返回任意一行。您需要在ORDER BY
中提供逻辑来告诉数据引擎哪个是"第一"。行。根据您的问题中的基本逻辑,这应该是:
SELECT TOP (1)
{Explicit Column List}
realestates
WHERE Address_Street = '[Street]'
AND Address_ZipCode = '1200'
ORDER BY CASE Address_Number WHEN '160' THEN 1 ELSE 2 END;
你不能优先考虑WHERE
子句中的任何内容。它总是产生所有匹配的行。你能做的是使用TOP
或FETCH
来限制你将看到的结果的数量。
然而,为了使其有效,必须有ORDER BY
条款。SQL表是无序集合根据定义。这意味着没有ORDER BY
子句,数据库可以自由地以它认为方便的任何顺序返回行。大多数情况下,这将是主键的顺序,但也有很多事情可以改变这一点。