0

I have a query that I am writing in MS-SQL that must check to see if the information about a client is already in the table before inserting it. If one entity has changed then the row will be inserted. The questions is can I combine operators in the where clause? Right now I have a query that looks like this:

select * from @Temp c
where exists (select * from Clients c2
            where (c.ClientId = c2.ClientId and c.ClientFName <> c2.FirstName) 
            or (c.ClientId = c2.ClientId and c.ClientLName <> c2.LastName)
            or (c.ClientId = c2.ClientId and c.ClientAddress <> c2.Address)
            or (c.ClientId = c2.ClientId and c.ClientCity <> c2.City)
            or (c.ClientId = c2.ClientId and c.ClientState <> c2.State)
            or (c.ClientId = c2.ClientId and c.ClientZip <> c2.Zip)

Is there any advantage or disadvantage to writing the query like this:

select * from @Temp c
where exists (select * from Clients c2
            where (c.ClientId = c2.ClientId 
            and (c.ClientFName <> c2.FirstName 
            or c.ClientLName <> c2.LastName 
            or c.ClientAddress <> c2.Address 
            or c.ClientCity <> c2.City
            or c.ClientState <> c2.State
            or c.ClientZip <> c2.Zip)))

To me both queries work but what is the best way to write this?

4

3 に答える 3

2

実際には、2 つのクエリのクエリ プランを見ると、オプティマイザーがそれらを同じものに縮小していることがわかります。そうでない場合は、最高のパフォーマンスを提供するバージョン (クエリ プラン) を選択しますが、この 2 つは同等であり、オプティマイザーはそれに気づき、悪用する可能性があります。

いずれかの列で NULL が許可されている場合、その列の比較は不適切であることに注意してください。次のようなものが必要です。

OR c1.ClientAddress <> c2.ClientAddress
OR (c1.ClientAddress IS NULL AND c2.clientAddress IS NOT NULL)
OR (c1.ClientAddress IS NOT NULL AND c2.clientAddress IS NULL)
于 2013-02-19T17:40:09.383 に答える
1

冗長性を排除できるときはいつでも、それは良いことです。2番目の方法が勝ちます。:)

ところで、問題のあるレコードを見つけることができるよう@tempにロードされたと仮定して、あなたが尋ねなかったより良い質問に答えましょう。Clientsあなたがすることができた:

SELECT * FROM Clients
WHERE clientid in (
    SELECT clientid from ( select distinct * from Clients ) t
    GROUP BY clientid HAVING count(*) > 1 )

(これにより、sの比較の混乱もなくなりますnull

于 2013-02-19T17:30:55.350 に答える
1

正確な質問がここにあるのかよくわかりません。しかし、どちらも問題ないように見えます。読みやすさの観点からは2番目の方が好きですが、それが好みです。

パフォーマンスに関しては、違いに気付かないと思います。

于 2013-02-19T17:31:16.890 に答える