Sql server SQL Server中带查询的运算符和带值的运算符之间的差异

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

我正在写一个给我奇怪结果的查询,或者我做错了什么。我在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并存储在临时表中,如下所示:

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中的值是相同的。出了点问题。我会让你知道什么时候我会解决这个问题,这应该是可行的。还发生了其他事情。是的,这应该行得通,但我不知道这个查询出了什么问题。