2013-07-09 22 views
7

誰かがこの表を正規化し、ベストプラクティスを実行する前に、私はこれをSQL Server 2008 R2の古い表であることを認めます私はそれを変えることについて何もすることはできません。この表には、次の列があります。同じ行の異なる列の重複する値を見つける

"PreparedBy", "PrelimApprovalBy", "Approval1Signer", "Approval2Signer" 

これらのフィールドはすべてユーザー名またはNULLか ''のいずれかです。上記の2つ以上のフィールドに同じユーザー名が表示される行をすべて取得したいとします。 2つのフィールドがNULLの場合、ではなくと一致し、両方が ''の場合はではないと一致します。したがって、NULLと ''の両方は、何も意味しないので、除外する必要があります。


ここで私はSO FARと考えるものだが、それを好きないです:
私は線に沿って何かをすることによってWHERE句(NULLをチェックし、「」)ですべての順列をチェックすることを考えています

WHERE PreparedBy = PrelimApprovalBy OR PreparedBy = Approval1Signer OR ... 

これを行うにはより良い方法があるはずです。

答えて

7

は、ここに1つです:基本的に

SELECT * FROM T 
WHERE EXISTS 
    (SELECT 1 
     FROM (VALUES 
        (PreparedBy) 
        ,(PrelimApprovalBy) 
        ,(Approval1Signer) 
        ,(Approval2Signer)) AS X (n) 
     WHERE NULLIF(n, '') IS NOT NULL 
     GROUP BY n 
     HAVING COUNT(*)>1 
    ) 

、行ごとに、我々は異なる行の列の値とミニテーブルを構築し、GROUP BYを行うと一致する値のグループを確認するために抱えています。 NULLIFはNULLの値を無視してすべてのNULLを除外するのに役立ちます。

+0

これは素晴らしいです!できます!前にこの構文を見たことがない... FROM(VALUES ... AS X(n))。私は今日何か新しいことを学んだ! – Denis

+0

新しい構文を助けてくれることをうれしく思います。工具ベルトの多くの工具は傷つけられません。また、このソリューションでは多くの列を簡単に処理できますが、他の方法ではサイズや複雑さが急速に爆発的に増加します。 – GilM

+0

+1はきれいに見えます。これは任意のSQLサーバーで動作しますか? –

2

は、この文字列で検索してください:

SELECT PreparedBy, PrelimApprovalBy, Approval1Signer, Approval2Signer 
WHERE 
((PreparedBy = PrelimApprovalBy AND NULLIF(PreparedBy, '') IS NOT NULL) 
OR 
(PreparedBy = Approval1Signer AND NULLIF(PreparedBy, '') IS NOT NULL) 
OR 
(PreparedBy = Approval2Signer AND NULLIF(PreparedBy, '') IS NOT NULL) 
OR 
(PrelimApprovalBy = Approval1Signer AND NULLIF(PrelimApprovalBy, '') IS NOT NULL) 
OR 
(PrelimApprovalBy = Approval2Signer AND NULLIF(PrelimApprovalBy, '') IS NOT NULL) 
OR 
(Approval1Signer = Approval2Signer AND NULLIF(Approval1Signer, '') IS NOT NULL)) 

私はあなたが求めるものを達成するためにsimplier何も考えることはできません。

+0

これは機能しません! PreparedByがNULLで、Approval1Signer = Approval2Signerの場合はどうなりますか?私はそのレコードが欲しいですが、あなたはPreparedByがNULLなのでそれを除外します。 – Denis

+0

@Denis私はそれに応じてそれを変更しました。今すぐ働かなければならない。 :) –

+0

@Denisそれはかなり醜いように見える - しかし、再び:私はあなたが探している結果を得るだろう簡単な何かを考えることができません。 –

関連する問題