2013-02-19 3 views
0

У меня есть запрос, который я пишу в MS-SQL, который должен проверить, есть ли информация о клиенте уже в таблице перед его вставкой. Если один объект изменился, строка будет вставлена. Возникают вопросы: могу ли я объединить операторов в разделе where? Сейчас у меня есть запрос, который выглядит следующим образом:sql объединяет несколько операторов

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) 

Есть ли преимущество или недостаток в написании запроса, как это:

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))) 

Для меня оба запроса работать, но то, что это лучший способ написать это?

ответ

1

Каждый раз, когда вы можете устранить избыточность, это хорошо. Побеждает второй путь. :)

BTW, давайте ответим на лучший вопрос, который вы не задали, считая, что @temp был загружен с Clients, чтобы вы могли найти проблемные записи. Вы могли бы сделать:

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

(это также устраняет беспорядок сравнения для null с)

1

Я не совсем уверен, что точный вопрос здесь. Но, оба выглядят отлично - я предпочитаю второй с точки зрения удобочитаемости, но это предпочтение.

Производительность разумная, я не думаю, что вы заметите разницу.

2

На практике, если вы посмотрите планы запросов для двух запросов, вы, вероятно, обнаружите, что оптимизатор сводит их к одному и тому же. Если это не так, вы должны выбрать версию, которая обеспечивает лучшую производительность (план запроса), но эти два эквивалента, и оптимизатор, скорее всего, заметит это и использует это.

Отмечу, что если какой-либо из столбцов допускает нули, то сравнение для этого столбца является неадекватным. Вам нужно что-то большее:

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) 
Смежные вопросы