2017-02-27 73 views
-1

我正在写一个查询,它给了我奇怪的结果或者我做错了什么。我正在使用IN运营商在其中条款。我从应用程序复原country_id(可为空),province_id(可为空)和city_id(可为空)。如果city_id不为空,那么我提取所有centre_id,该city_id存储在临时表中。如果city_id为null,并且province_id不为空的话,我提取所有centre_id存在于该province_id并以同样的方式,如果city_idprovince_id都是空的话,我提取centre_id中存在的COUNTRY_ID,如果所有3个为空的话,我提取所有centre_id并存储在临时表象下面这样:SQL Server IN操作符与值查询和IN操作符之间的区别值

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)** 

现在问题是这个查询给出了所有center_id的所有交易。我检查了它。如果临时表中只有一个id,并且值为1,那么它会为我提供所有事务。当我运行下面的硬编码值查询,它给出正确的结果

**Select Count(1) 
    From Tranactions 
    where service_centre_id IN (1)** 

什么之间不同的地方service_centre_id IN(选择service_centre_id从@serviceCenter)其中service_centre_id(1)。 什么问题?

+0

这应该工作。其他事情正在发生。 – Paparazzi

+0

是的这应该工作,但我不知道这个查询有什么问题。 – Umer

回答

0

问题是这样的查询获取所有service_center_id:

@serviceCenter必须是一个表名。

其中center_id IN(选择service_centre_id从@serviceCenter)

和另外一个是刚刚选择只包含1 service_center_id

其中center_id(1)

+0

感谢您的答案,但问题不在于此。 – Umer

+0

好的,那么你的问题究竟是什么? –

0

首先,您可以使用COALESCE()严格简化此查询,例如:

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 
; 

每个JOIN这里使用适当的表连接,以及您想要匹配的参数条件。因为我们使用的是LEFT JOIN,所以任何不匹配的条件都会从该表中返回一个NULL值。

COALESCE()函数将表达式列表,返回的第一个不是NULL,因此受到COALESCE()功能中的排序表达式,以你喜欢,你可以告诉它,“试图把我的城市.service_centre_id首先,然后是省.service_centre_id,然后是Country.service_centre_id ...“等等。

从你描述的内容来判断,我想知道如果问题不在参数中传递给查询的值中。如果你可以手动写出来:

SELECT COUNT(1) 
FROM Tranactions 
WHERE center_id IN (1) 
; 

这就给你正确的结果,那么问题可能是在传递的值。

原始查询的结束:

INSERT INTO @serviceCenter 
SELECT service_centre_id 
FROM ServiceCentre 
; 

似乎所有service_centre_id值传递到@serviceCenter变量。

是否有可能没有正确传递参数,因此所有service_center_ids被选中到表变量中,这会导致您接收所有服务中心的所有事务计数?

注:要对此进行检查,可以运行在您的IF...ELSE系列的结尾简单SELECT * FROM @serviceCenter看到返回了哪些值。我的怀疑是你会得到比你想要的更多的东西。

+0

感谢您的回答。所有参数都正确传递。 – Umer

+0

Hey Umer。对于这个问题我很抱歉,但在语义上两个'SELECT'语句之间没有区别,除非这些值实际上是不同的。还有其他的东西导致了这个问题 - 这两个'SELECT'选择不是技术上的区别。如果@serviceCenter中的唯一值= 1,那么它们是相同的;唯一的其他扩展是@serviceCenter中的值不同。 – 3BK

+0

这应该可以工作,但@serviceCenter中的值是相同的。出事了。我会让你知道我何时会解决问题 – Umer

0

终于在2个小时后,我发现错误和错误是什么,除了拼写错误。首先,我很抱歉,因为问题我使用了center_id,但它实际上是service_centre_id。但是我更新了这个问题。现在来解决这个问题。该表的声明低于:

**DECLARE @serviceCenter TABLE (service_center_id INT) 

和where子句低于:

Select Count(1) 
From Tranactions 
    where service_centre_id IN (Select service_centre_id From @serviceCenter) 

的问题是在service_centre_id

的事务表包含列service_centre_id,并在运营商查询我使用service_centre_id的代替service_center_id。因为在声明表时,我将列名称设置为service_center_id。所以实际的错误是我使用service_centre_id而不是service_center_id并且有拼写错误。