2016-12-02 3 views
3

В моем SP я создаю временную таблицу #PolicyNumbers и заполняю ее Policy Numbers на основе параметров, которые будут переданы SP.Каким будет правильный способ использования предложения EXISTS

CREATE TABLE #PolicyNumbers (PolicyNumber varchar(50)) 
INSERT INTO #PolicyNumbers SELECT PolicyNumber 
          FROM PlazaInsuranceWPDataSet 
          WHERE State IN (SELECT * FROM [dbo].[StringOfStringsToTable](@State,',')) 
          AND Coverage IN (SELECT * FROM [dbo].[StringOfStringsToTable](@Coverage,',')) 
          AND SICCode IN (SELECT * FROM [dbo].[StringOfStringsToTable](@SICCode,',')) 

ниже в моем SP я использую EXISTS заявление, чтобы фильтровать только те PolicyNumber S, которые были выбраны на основе параметров.

WHERE EXISTS (SELECT PolicyNumber FROM #PolicyNumbers pn WHERE pn.PolicyNumber = piwp.PolicyNumber) 

Так что результат от #PolicyNumbers НЕ содержат дублирует PolicyNumbers:

enter image description here

Тогда furthure в моем SP я имею SELECT заявление и результат содержит также продублировать PolicyNumber S:

SELECT 
      PolicyNumber, 
      Cast(PolicyEffectiveDate AS DATE) AS PolicyEffectiveDate, 
      Cast(PolicyExpirationDate AS DATE) AS PolicyExpirationDate, 
      WrittenPremium 
      FROM PlazaInsuranceWPDataSet 

enter image description here

А теперь я использую EXIST заявление:

SELECT 
     PolicyNumber, 
     Cast(PolicyEffectiveDate AS DATE) AS PolicyEffectiveDate, 
     Cast(PolicyExpirationDate AS DATE) AS PolicyExpirationDate, 
     WrittenPremium 
     FROM PlazaInsuranceWPDataSet piwp 
     WHERE EXISTS (SELECT PolicyNumber FROM #PolicyNumbers pn WHERE pn.PolicyNumber = piwp.PolicyNumber) 

это все правильно до сих пор? Если да, то почему у меня есть немного другой результат, используя оператор SELECT и передающий те же параметры в статье WHERE с использованием IN (@MyParameter)?

SELECT 
      PolicyNumber, 
      Cast(PolicyEffectiveDate AS DATE) AS PolicyEffectiveDate, 
      Cast(PolicyExpirationDate AS DATE) AS PolicyExpirationDate, 
      WrittenPremium 
      FROM PlazaInsuranceWPDataSet piwp 
      WHERE State IN (@State) 
        AND SICCode IN (@SICCode) 
        AND Coverage IN (@Coverage) 

ответ

2

Разница между вашими двумя запросами, является то, что первый получает список номеров политики, в которых по крайней мере одна из строк в таблице соответствует на State, SICode и Coverage. Так как существует несколько строк в PlazaInsuranceWPDataSet, и каждый из них может иметь разные State, SICode и Coverage (предположительно), это не то же самое, что выбирать только строки из PlazaInsuranceWPDataSet, которые соответствуют этим трем предикатам.

Вот упрощенный пример:

Create Table PlazaInsuranceWPDataSet (
    PolicyNumber varchar(1), 
    State varchar(3)) 

Insert Into PlazaInsuranceWPDataSet 
Values ('A', 'Qld'), 
     ('A', 'NSW'); 

Create Table #PolicyNumbers (PolicyNumber char(1)); 
Insert Into #PolicyNumbers 
Select PolicyNumber 
    From PlazaInsuranceWPDataSet 
    Where State = 'Qld'; 

-- Returns all policy numbers where at least one row matches the predicate. 
Select * 
    From PlazaInsuranceWPDataSet As piwp 
    Where Exists (Select 1 From #PolicyNumbers As pn 
       Where pn.PolicyNumber = piwp.PolicyNumber); 

-- Returns only rows of 'A' that match the filter predicate      
Select * 
    From PlazaInsuranceWPDataSet 
    Where State = 'Qld'; 

один (и только один) из рядов номер полиса «A» соответствует условию так, когда мы записываем этот номер политики в нашей темп таблицы и сравнить к нему позже мы получим все строки «A» назад.

+0

#Mendosi спасибо. Удивительное объяснение. И спасибо за пример. Очень приятно это знать. Это просто приводит меня к другому вопросу, какой путь был бы правильным? Или я должен сказать более уместным? Или это зависит от цели? Цель состоит в том, чтобы выбрать номера политик на основе параметров, а затем рассчитать заработок для этих политик. Я хочу работать с политиками, которые имеют только SICCode, State и Coverage. Поэтому я бы предположил, что использование '# PolicyNumbers' и' EXISTS' будет правильным. Я прав? – Oleg

+0

Похоже, что версия 'EXISTS' верна для вас, чтобы ответить на этот вопрос. – mendosi

Смежные вопросы