Sql server SQL Server中带查询的运算符和带值的运算符之间的差异
我正在写一个给我奇怪结果的查询,或者我做错了什么。我在where子句中使用IN运算符。我从应用程序中恢复country_id nullable、province_id nullable和city_id nullable。若city_id不为null,则提取该city_id中存在并存储在temp表中的所有center_id。如果城市id为空,省id不为空,则我提取该省id中存在的所有中心id,同样,如果城市id和省id均为空,则我提取国家id中存在的中心id,如果所有3个都为空,则我提取所有中心id并存储在临时表中,如下所示:Sql server SQL Server中带查询的运算符和带值的运算符之间的差异,sql-server,Sql Server,我正在写一个给我奇怪结果的查询,或者我做错了什么。我在where子句中使用IN运算符。我从应用程序中恢复country_id nullable、province_id nullable和city_id nullable。若city_id不为null,则提取该city_id中存在并存储在temp表中的所有center_id。如果城市id为空,省id不为空,则我提取该省id中存在的所有中心id,同样,如果城市id和省id均为空,则我提取国家id中存在的中心id,如果所有3个都为空,则我提取所有中心i
DECLARE @serviceCenter TABLE (service_center_id INT)
IF (@city_id IS NOT NULL)
BEGIN
INSERT INTO @serviceCenter
SELECT service_centre_id
FROM ServiceCentre
WHERE city_id= @city_id
END
ELSE IF (@province_id IS NOT NULL)
BEGIN
INSERT INTO @serviceCenter
SELECT service_centre_id
FROM ServiceCentre
INNER JOIN City ON City .city_id= ServiceCentre.city_id
INNER JOIN Province ON Province.province_id= City.province_id
WHERE Province.province_id= @province_id
END
ELSE IF (@country_id IS NOT NULL)
BEGIN
INSERT INTO @serviceCenter
SELECT service_centre_id
FROM ServiceCentre
INNER JOIN City ON City .city_id= ServiceCentre.city_id
INNER JOIN Province ON Province.province_id= City.province_id
INNER JOIN Country ON Country.country_id= City.country_id
WHERE Country.country_id = @country_id
END
ELSE
BEGIN
INSERT INTO @serviceCenter
SELECT service_centre_id
FROM ServiceCentre
END
现在,基于服务中心,我需要得到如下所示的事务计数
**Select Count(1)
From Tranactions
where service_centre_id IN (Select service_centre_id From @serviceCenter)**
现在的问题是这个查询提供了所有中心的所有事务id。我检查了它。若临时表中只有一个id,并且值为1,那个么它将给出所有事务。当我使用硬代码值运行下面的查询时,它会给出正确的结果
**Select Count(1)
From Tranactions
where service_centre_id IN (1)**
从@serviceCenter中选择service\u centre\u id中的where service\u centre\u id与1中的where service\u centre\u id有什么不同。
有什么问题吗?问题在于此查询获取所有服务中心的id: @serviceCenter必须是表名 其中中心id在@serviceCenter中选择服务中心id 另一个是只选择包含1个服务中心id 1中的中心id在哪里
首先,您可以通过使用以下命令来大大简化此查询:
INSERT INTO @serviceCenter
SELECT COALESCE(City.service_centre_id,Provice.service_centre_id,Country.service_centre_id,ServiceCentre.service_centre_id)
FROM ServiceCentre
LEFT JOIN City
ON City.city_id = ServiceCentre.city_id
AND City.City_ID = @city_id
LEFT JOIN Province
ON Province.province_id = City.province_id
AND Province.province_id = @province_id
LEFT JOIN Country
ON Country.country_id = City.country_id
AND Country.country_id = @country_id
;
这里的每个联接都使用适当的表联接,以及要匹配的参数条件。因为我们使用的是左连接,任何不匹配的条件都将从该表返回空值
COALESCE函数获取一个表达式列表,并返回第一个不为空的表达式,因此,通过对COALESCE函数中的表达式进行排序,您可以告诉它,尝试先给我City.service\u center\u id,然后给我省.service\u center\u id,然后给我Country.service\u center\u id。。。等等
从您描述的内容判断,我想知道问题是否不在于参数中传递到查询中的值。如果可以手动写出:
SELECT COUNT(1)
FROM Tranactions
WHERE center_id IN (1)
;
这会给你一个正确的结果,那么问题可能在于传递的值
原始查询的结尾:
INSERT INTO @serviceCenter
SELECT service_centre_id
FROM ServiceCentre
;
似乎将所有服务中心id值传递到@serviceCenter变量中
是否有可能参数传递不正确,因此所有service\u center\u ID都被选择到表变量中,这将导致您收到所有ServiceCenter的所有事务计数
注意:要检查这一点,您可以在IF…ELSE系列末尾从@serviceCenter运行一个简单的SELECT*来查看返回的值。我怀疑你会得到比你想要的更多的东西。两个小时后,我终于发现了这个错误,除了拼写错误之外,错误什么都没有。首先,我道歉,因为在问题中我使用了中心id,但实际上是服务中心id。但是我更新了问题。现在来谈谈问题。该表的声明如下:
**DECLARE @serviceCenter TABLE (service_center_id INT)
Select Count(1)
From Tranactions
where service_centre_id IN (Select service_centre_id From @serviceCenter)
where条款如下:
**DECLARE @serviceCenter TABLE (service_center_id INT)
Select Count(1)
From Tranactions
where service_centre_id IN (Select service_centre_id From @serviceCenter)
问题出在维修中心
事务表包含列service\u center\u id,在操作员查询中,我使用service\u center\u id而不是service\u center\u id。因为在声明表时,我将列名设置为service\u center\u id。因此,实际的错误是我使用service\u center\u id而不是service\u center\u id,并且存在拼写错误。谢谢您的回答,但问题不是这个。谢谢您的回答。所有参数都被正确传递。嘿,乌默。我很抱歉对此很固执,但从语义上讲,两个SELECT语句之间没有差异,除非值实际上不同。另一个原因导致了这个问题——这不是两个可选方案之间的技术差异。如果@serviceCenter中的唯一值=1,则它们是相同的;唯一的其他解释是@serviceCenter中的值不同。这应该可以工作,但@serviceCenter中的值是相同的。出了点问题。我会让你知道什么时候我会解决这个问题,这应该是可行的。还发生了其他事情。是的,这应该行得通,但我不知道这个查询出了什么问题。