2013-04-13 26 views
0

我有一個非常困難的時間讓這個查詢處理沒有錯誤。你能讓我走上正軌嗎?我一直在擺弄大約一個小時的變化。簡單的查詢 - 爲什麼它會拋出錯誤?

正如你所看到的,我試圖讓casetype_txt字段等於'DONATION'總記錄數,然後在B表得到所有Groups不爲空值。所以,總計數是我試圖達到的。

SELECT 
    COUNT(casetype_txt) 

FROM 
    amd_full_merged_st_load_case AS a 

WHERE 
    a.casetype_txt = 'DONATION' 

LEFT JOIN amd_full_merged_st_load_case AS b 
    ON a.case_id=b.case_id 

WHERE b.group != ''; 

回答

2

你的語法是不正確的,試試這個,

SELECT COUNT(casetype_txt) 
FROM amd_full_merged_st_load_case AS a 
     LEFT JOIN amd_full_merged_st_load_case AS b 
      ON a.case_id = b.case_id AND 
       b.group != '' 
WHERE a.casetype_txt = 'DONATION' 

爲了進一步獲得更多的知識有關加入,請訪問以下鏈接:

1

讓我們一次一個。

首先,表JOIN將在FROM條款中進行。在此之後的條款是WHERE。所以,一個有效的查詢將會是(注意,我們不能在簡單的查詢中具有2個WHERE子句,所以這兩個條件必須與AND-或有時與OR結合,但在這裏可能不是這種情況):

-- Version 1 -- 
SELECT 
    COUNT(a.casetype_txt) 

FROM 
    amd_full_merged_st_load_case AS a 

    LEFT JOIN amd_full_merged_st_load_case AS b 
    ON a.case_id=b.case_id 

WHERE 
    a.casetype_txt = 'DONATION' 

    AND b.group <> '' ; 

現在,因爲子句中有關於b表(LEFT外連接右側的表)的條件,所以這會使外連接作爲內連接工作。 SO,上面的查詢相當於:

-- Version 2 -- 
SELECT 
    COUNT(a.casetype_txt) 

FROM 
    amd_full_merged_st_load_case AS a 

    INNER JOIN amd_full_merged_st_load_case AS b 
    ON a.case_id=b.case_id 

WHERE 
    a.casetype_txt = 'DONATION' 

    AND b.group <> '' ; 

以上(版本2)很可能是你以後的。還有一個問題。根據兩個表(1-1,1-n,n-1,n-n)之間的關係,查詢可能會給出錯誤的計數,因爲連接可能會爲特定的case_id產生許多行。所以,你也應該檢查,如果轉換到加入半連接(使用子查詢EXISTS)爲您提供您所尋求的答案:

-- Version 3a -- 
SELECT 
    COUNT(a.*)          -- we want to count rows 

FROM 
    amd_full_merged_st_load_case AS a    -- from table a 

WHERE           -- where 
    a.casetype_txt = 'DONATION'     -- casetype is DONATION 
               -- and 
    AND EXISTS          -- at least one 
     (SELECT *         -- (related row) exists 
     FROM amd_full_merged_st_load_case AS b -- in table b 
     WHERE a.case_id = b.case_id    
      AND b.group <> '' 
    ) ; 

或:

-- Version 3b -- 
SELECT 
    COUNT(b.*)          -- we want to count rows 

FROM 
    amd_full_merged_st_load_case AS b    -- from table b 

WHERE           -- where 
    b.group <> ''         -- group is not empty 
               -- and 
    AND EXISTS          -- at least one 
     (SELECT *         -- (related row) exists 
     FROM amd_full_merged_st_load_case AS a -- in table a 
     WHERE a.case_id = b.case_id    
      AND a.casetype_txt = 'DONATION'   
    ) ;