2010-11-15 3 views
0

HI Gurus, Я ищу, чтобы заменить предложение IN существующим, но, несмотря на чтение других подобных случаев, я не смог применить их к своему набору данных.Замена В разделе существует

Ищу добавить колонку к моему основному запросу, который говорит мне, что если фонд находится в отдельном списке, и если он затем маркировать его «аварийный», а если нет, то «нечрезвычайные»

список определяется следующим образом:

select 
f.id 
FROM _audit a 
INNER JOIN _fund f ON a.article_id = f.id 
WHERE a.entity_name = 'Fund' 
AND a.Changes LIKE 
'%finance_code2%OldValue>3%' 
) 
UNION 
(
select 
id AS fund_reference 
FROM _fund 
WHERE (finance_code2 LIKE '3%' 
OR finance_code2 LIKE '9%') 
AND finance_code2 IS NOT NULL 

И вот что я ищу, в основном что-то вроде:

SELECT 
...Main query here... 
,CASE WHEN fund_id IN (list_details) THEN 'emergency' else 'non-emergency' end 

Я знаю, что это было бы более эффективным, чтобы сделать что-то как

SELECT 
...Main query here... 
,SELECT CASE WHEN EXISTS 
(SELECT fund_id FROM list_details WHERE fund_id IS NOT NULL) THEN 'emergency' else 'non-emergency' END 

Но каждый раз, когда я пытаюсь это постоянно возвращается ложные ценности (о том, что средства, содержащиеся в списке, когда они не являются)

В случае это помогает, я использую SQL Server 2005 и главный запрос приведена ниже, где list_details результат (ID) присоединяется на donation_fund_allocation на list_details.id = donation_fund_allocation.fund_id

Как всегда любая подсказка будет массово оценили :) спасибо!

Главного запрос

SELECT 
don.supporter_id AS contact_id 
,don.id AS gift_id 
,YEAR(don.date_received) AS calendar_year 
,YEAR(don.date_received) - CASE WHEN MONTH(don.date_received) < 4 THEN 1 ELSE 0 END AS financial_year 
,don.date_received AS date_received 
,don.event_id AS event_id 
,SUM(CASE WHEN don.gift_aid_status <> 4 THEN don.value_gross * ((dfa.percentage)/100) 
      WHEN don.gift_aid_status = 4 AND don.value_net > don.value_gross 
      AND don.value_net <> 0  THEN don.value_net * ((dfa.percentage)/100) 
      ELSE don.value_gross * ((dfa.percentage)/100) 
      END 
     ) AS donation_value 
--**List details query to go in here** 
FROM donation don WITH (nolock) 
INNER JOIN donation_fund_allocation dfa WITH (nolock) ON dfa.donation_id = don.id 
WHERE don.supporter_id IS NOT NULL 
AND don.status = 4 
AND don.value_gross <> 0 
GROUP BY don.supporter_id 
,don.id 
,don.date_received 
,don.event_id 
+0

Просто примечание стороны: с простым предикатом равенства 'IN' и' EXISTS' имеют ту же эффективность в 'SQL Server' и дают те же планы. – Quassnoi

ответ

1

Вы должны соотносить существует вызов с внешним запросом. Как написано вы просто спрашиваете, если существуют какие-либо строки в list_details где fund_id не является нулевым

Итак, что вы на самом деле хотите,

SELECT 
...Main query here... 
,SELECT CASE WHEN EXISTS 
(SELECT 1 FROM list_details WHERE fund_id = outer.fund_id) THEN 'emergency' else 'non-emergency' END 

Где outer это псевдоним таблицы для того, где fund_id может быть найденных в вашем основном select

+0

Не забудьте Союз. –

+0

Означает ли это, что соединение из list_details не содержится в предложении CASE WHEN EXISTS, но только из самой главной таблицы? AS, когда я пытаюсь сделать (выберите 1 FROM (запрос list_definition, похоже, ему это не нравится? – Dibstar

0

Вы можете написать функцию, которая берет fund_id и возвращает соответствующее строковое значение «Emergency» или «non-emergency».

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