2017-08-02 10 views
1

私には奇妙な質問があります。私は最後に追加したテキストの変数は、連合を阻止することが心配ですSQL:指定された列を除いてすべての重複を防ぐ

SELECT EOU.EventSessionKey, EOU.EventSourceID, EOU.EventSeq, 
    EOU.EventColumnName, EOU.ProSymbol, 
    EOU.ProKey, tP.isActive, tP.Description, 
    'POSITIVE' AS ErrType FROM EOU 
LEFT JOIN dbRunoff.dbo.tPro tP 
    ON tP.Symbol COLLATE DATABASE_DEFAULT 
     = EOU.ProSymbol COLLATE DATABASE_DEFAULT 
WHERE tP.IsActive = 1 AND (EOU.ProKey IS NULL OR EOU.ProKey <= 0) 

UNION 

SELECT EOU.EventSessionKey, EOU.EventSourceID, EOU.EventSeq, 
    EOU.EventColumnName, EOU.ProSymbol, 
    EOU.ProKey, tP.isActive, tP.Description, 
    'DUPLICATE' AS ErrType FROM EOU 
LEFT JOIN dbRunoff.dbo.tPro tP 
    ON tP.Symbol COLLATE DATABASE_DEFAULT 
     = EOU.ProSymbol COLLATE DATABASE_DEFAULT 
JOIN ProFilter PF ON PF.ProKey = tp.ProKey 
WHERE tP.IsActive = 1 AND (EOU.ProKey IS NULL OR EOU.ProKey <= 0)) 

:しかし私は、各テーブルには、私はどこから来たSELECT句の指定に書いた余分な変数を持って、任意の重複列を望んでいません重複した値を適切に削除できません。ユニオンがテーブル間で重複値を削除することを保証する(シンプル/効率的な)方法はありますが、ユニオンに重複を読み取らせないテキスト変数は無視されますか?

私はこれを行う簡単な方法を探しています。私はこれを強要するいくつかの方法を知っていますが、効率とスピードは懸念です。

+0

だけでなく、それが重複した(最後の列がユニークだった)あなたが保つ行の最後の列に属性をしたいと思われる値だった場合?ポジティブか重複? – scsimon

+0

'Duplicate'、その名前は私が追跡している特定のタイプのイベントを参照しています。 –

+1

どちらのサブクエリにも重複が表示されますか? 'union'は、そのコンポーネントの間および内部の両方の重複を削除します。 –

答えて

3

MIN()にはCTEを使用できます。 DPの前に来るので、の重複が存在する場合は、の正の値を使用します。

私はUNIONなしでこれを書き直すつもりです。

with cte as(
SELECT EOU.EventSessionKey, EOU.EventSourceID, EOU.EventSeq, 
    EOU.EventColumnName, EOU.ProSymbol, 
    EOU.ProKey, tP.isActive, tP.Description, 
    'POSITIVE' AS ErrType FROM EOU 
LEFT JOIN dbRunoff.dbo.tPro tP 
    ON tP.Symbol COLLATE DATABASE_DEFAULT 
     = EOU.ProSymbol COLLATE DATABASE_DEFAULT 
WHERE tP.IsActive = 1 AND (EOU.ProKey IS NULL OR EOU.ProKey <= 0) 

UNION 

SELECT EOU.EventSessionKey, EOU.EventSourceID, EOU.EventSeq, 
    EOU.EventColumnName, EOU.ProSymbol, 
    EOU.ProKey, tP.isActive, tP.Description, 
    'DUPLICATE' AS ErrType FROM EOU 
LEFT JOIN dbRunoff.dbo.tPro tP 
    ON tP.Symbol COLLATE DATABASE_DEFAULT 
     = EOU.ProSymbol COLLATE DATABASE_DEFAULT 
JOIN ProFilter PF ON PF.ProKey = tp.ProKey 
WHERE tP.IsActive = 1 AND (EOU.ProKey IS NULL OR EOU.ProKey <= 0)) 

select distinct 
    EventSessionKey 
    ,EventSourceID 
    ,EventSeq 
    ,EventColumnName 
    ,ProSymbol 
    ,ProKey 
    ,isActive 
    ,Description 
    ,min(cte2.ErrType) 
from 
    cte 
    left join 
    cte2 on cte.EventSessionKey = cte2.SessionKey --assumption based of column name. Use correct key to join. 
group by 
    EventSessionKey 
    ,EventSourceID 
    ,EventSeq 
    ,EventColumnName 
    ,ProSymbol 
    ,ProKey 
    ,isActive 
    ,Description 

EDIT

これは基本的に私は左にProFilterにごINNER JOINを変更...あなたに私は、クエリあなたに何を参照してくださいオフに基づいて、同じことをジョインを与える必要があります。この参加の結果がTRUEの場合、UNIONによると、の重複のレコードになります。それがなかった場合、それは次のようになり

SELECT 
    EOU.EventSessionKey, 
    EOU.EventSourceID, 
    EOU.EventSeq, 
    EOU.EventColumnName, 
    EOU.ProSymbol, 
    EOU.ProKey, 
    tP.isActive, 
    tP.Description, 
    case when pf.ProKey is null then 'Positive' else 'Duplicate' end as ErrType 
FROM 
    EOU 
LEFT JOIN 
    dbRunoff.dbo.tPro tP 
    ON tP.Symbol COLLATE DATABASE_DEFAULT = EOU.ProSymbol COLLATE DATABASE_DEFAULT 
LEFT JOIN 
    ProFilter PF 
    ON PF.ProKey = tp.ProKey 
WHERE 
    tP.IsActive = 1 
    AND (EOU.ProKey IS NULL OR EOU.ProKey <= 0) 
+0

私の脳を2番目のものに包み込むのが簡単+1 –

+0

私はOPの組み合わせが必要だと思ったが、それは私が使用する最も希少なものの1つであるという違いを伝えるためにクエリを解体した後、@JohnCappellettiに同意する。 – scsimon

+0

LEFT JOINロジックは、UNIONクエリと同じではありません。あなたはFULL OUTER JOINから始め、単純なUNIONを実際にシミュレートするために、すべてのフィールドを等価/無効にする必要があります。下記の私の答えを参照してください。 –

関連する問題