2017-02-27 80 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並且有拼寫錯誤。