2017-05-22 15 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(item_idからSELECT item_id FROM contract_attr group(item_id)> 1)x.item_id = ca.item_id'あなたの組合の第2部。基本的に、これはそれを解決し、内側のものはパーフェクト@scsimon – 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それは本当に「HAVING」で私の習慣です。私は通常、大きなステートメントでそれを使用したいと思っています。乾杯。 – 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

を助けるために喜ん@davidTunnellません。 2回目のJOINは何も返されません。 –

関連する問題