2017-05-22 79 views
2

我有一個查詢,它有時會返回不需要的行。根據主鍵的行數進行篩選

SELECT TOP 100 PERCENT 
    ca.item_id, ca.FIELD_ID, ca.attr_val, ca.upd_dtt, ca.upd_usr 
FROM 
    contract_attr ca 
WHERE 
    EXISTS (SELECT 1 
      FROM contract_attr ca_326 
      WHERE ca.item_id = ca_326.item_id 
       AND ca_326.field_id = 326 
       AND ca_326.ATTR_VAL = 'Y') 

UNION ALL 

SELECT 
    ca.item_id, 9999, mf.[ITEM_NAME], '', '' 
FROM 
    mfr mf 
JOIN 
    contract_attr ca ON ca.attr_val = mf.[ITEM_PK] 
ORDER BY 
    ca.item_id 

enter image description here

ITEM_ID是10-13圖像上只有1行。

我想過濾查詢中的這些行。看着它,我應該添加具有:

SELECT TOP 100 PERCENT 
    ca.item_id, ca.FIELD_ID, ca.attr_val, ca.upd_dtt, ca.upd_usr 
FROM 
    contract_attr ca 
WHERE 
    EXISTS (SELECT 1 
      FROM contract_attr ca_326 
      WHERE ca.item_id = ca_326.item_id 
       AND ca_326.field_id = 326 
       AND ca_326.ATTR_VAL = 'Y') 

UNION ALL 

SELECT 
    ca.item_id, 9999, mf.[ITEM_NAME], '', '' 
FROM 
    mfr mf 
JOIN 
    contract_attr ca ON ca.attr_val = mf.[ITEM_PK] 
HAVING 
    COUNT(ca.item_id) > 1 
ORDER BY 
    ca.item_id 

但我得到這個錯誤,不明白爲什麼:

列「contract_attr.ITEM_ID」在選擇列表中無效因爲它不包含在聚合函數或GROUP BY子句中。

我在做什麼錯,我該如何解決?

+1

因爲你有一堆其他字段,你想要返回你可能想要使用有一個子查詢,或者如果足夠的分組添加到一個group by子句。 – scsimon

+0

@scsimon當你說子查詢時,你的意思是包裝整個事情? –

+1

類似於'... JOIN contract_attr ca on ca.attr_val = mf。[ITEM_PK] INNER JOIN(SELECT item_id FROM contract_attr group by item_id having count(item_id)> 1)x on x.item_id = ca.item_id' in your你的工會的第二部分。基本上添加一個內部連接 – scsimon

回答

3

既然你是想返回多個列這將不能夠與具有所需的分組完成後,你可以使用在一個子查詢。

SELECT TOP 100 PERCENT 
    ca.item_id 
    ,ca.FIELD_ID 
    ,ca.attr_val 
    ,ca.upd_dtt 
    ,ca.upd_usr 
FROM contract_attr ca 
      WHERE EXISTS (
     SELECT 1 
     FROM contract_attr ca_326 
     WHERE ca.item_id = ca_326.item_id 
      AND ca_326.field_id = 326 
      AND ca_326.ATTR_VAL = 'Y' 
     ) 
UNION ALL 
SELECT ca.item_id 
    ,9999 
    ,mf.[ITEM_NAME] 
    ,'' 
    ,'' 
FROM mfr mf 
JOIN contract_attr ca ON ca.attr_val = mf.[ITEM_PK] 
INNER JOIN(SELECT item_id FROM contract_attr group by item_id having count(item_id) > 1) x on x.item_id = ca.item_id 
ORDER BY ca.item_id 
+0

不錯的工作解密,從問題和形象+1 – SqlZim

+0

謝謝@SqlZim它只是我真正的'具有'的習慣。我通常希望在一個大的聲明中使用它。乾杯。 – scsimon

2

你缺少一個group by

SELECT TOP 100 PERCENT ca.item_id 
     ,ca.FIELD_ID 
     ,ca.attr_val 
     ,ca.upd_dtt 
     ,ca.upd_usr 
    FROM contract_attr ca 
       WHERE EXISTS (
      SELECT 1 
      FROM contract_attr ca_326 
      WHERE ca.item_id = ca_326.item_id 
       AND ca_326.field_id = 326 
       AND ca_326.ATTR_VAL = 'Y' 
      ) 
    UNION ALL 
    SELECT ca.item_id 
     ,9999 
     ,mf.[ITEM_NAME] 
     ,'' 
     ,'' 
    FROM mfr mf 
    JOIN contract_attr ca ON ca.attr_val = mf.[ITEM_PK] 
    group by ca.item_id, mf.[ITEM_NAME] 
    HAVING count(ca.item_id) > 1 
    ORDER BY ca.item_id 
+1

這似乎篩選到一切。第二個JOIN沒有任何回報。 –

相關問題