2011-06-02 51 views
2

我有以下查詢的問題:問題的別名加入statiment

SELECT 
    g_contac.contid, g_contac.name, g_contac.email, f_sync.foreign_key, 
    (
     SELECT COUNT(g_cpers.cpersid) 
     FROM g_cpers 
     WHERE g_cpers.contid = g_contac.contid 
    ) AS employee_count 
FROM f_sync 
    FULL OUTER JOIN g_contac ON 
    (
     g_contac.contid = f_sync.external_id AND 
     model = case when f_sync.employee_count = 0 then 'PRIVATE' else 'COMPANY' end 
    ) 
WHERE model = 'COMPANY' or model = 'PRIVATE' OR model IS null 

當我執行它,我得到錯誤:

無效的列名稱employee_count「。

如何解決這個問題?

+0

在聯接語句中定義的模型上的where子句不會導致選擇所有行嗎? – 2011-06-02 08:04:07

+1

你在f_sync表中有employee_count字段嗎?如果不是,那麼錯誤是正確的。 – Arvo 2011-06-02 08:13:54

+0

@Arvo:我沒有。我從內部select中選擇 – Dusan 2011-06-02 08:15:21

回答

5

那是因爲你在查詢中提到f_sync.employee_count,但f_sync沒有列名爲employee_count:您剛纔創建的查詢中的動態列與別名employee_count

簡單的解決方法是重複計算:

SELECT 
g_contac.contid, g_contac.name, g_contac.email, f_sync.foreign_key, 
(
    SELECT COUNT(g_cpers.cpersid) 
    FROM g_cpers 
    WHERE g_cpers.contid = g_contac.contid 
) AS employee_count 
FROM f_sync 
FULL OUTER JOIN g_contac ON 
(
    g_contac.contid = f_sync.external_id AND 
    model = case when (SELECT COUNT(g_cpers.cpersid) 
    FROM g_cpers 
    WHERE g_cpers.contid = g_contac.contid) = 0 then 'PRIVATE' else 'COMPANY' end 
) 
WHERE model = 'COMPANY' or model = 'PRIVATE' OR model IS null; 

更好的解決方法是創建包括該列,這意味着它只能進行一次計算的圖。

編輯:改進的查詢和彙集各方意見

您可以通過使用SQL not exists而不是count(*) = 0提高清晰度一點:

SELECT 
g_contac.contid, g_contac.name, g_contac.email, f_sync.foreign_key 
FROM f_sync 
FULL OUTER JOIN g_contac ON 
(
    g_contac.contid = f_sync.external_id AND 
    model = case when not exists (SELECT * FROM g_cpers 
     WHERE g_cpers.contid = g_contac.contid) then 'PRIVATE' else 'COMPANY' end 
) 
WHERE model = 'COMPANY' or model = 'PRIVATE' OR model IS null; 
+0

謝謝,這是我需要的。注意:您可以刪除( SELECT COUNT(g_cpers.cpersid) FROM g_cpers WHERE g_cpers.contid = g_contac.contid )AS employee_count from code – Dusan 2011-06-02 08:32:49

0

你能試試這個:

SELECT 
    gt.contid, gt.name, gt.email, f_sync.foreign_key, 
    gt.employee_count 
FROM f_sync 
    FULL OUTER JOIN 
    ( SELECT 
      g_contac.contid, g_contac.name, g_contac.email, 
      (
       SELECT COUNT(g_cpers.cpersid) 
       FROM g_cpers 
       WHERE g_cpers.contid = g_contac.contid 
      ) AS employee_count 
     FROM g_contac 
    ) AS gt ON 
    (
     gt.contid = f_sync.external_id AND 
     model = case when gt.employee_count = 0 then 'PRIVATE' else 'COMPANY' end 
    )