2010-11-15 63 views
0

嗨,大師, 我正在尋找用存在替換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 

但每次我嘗試它使返回false值時(說資金都包含在列表中時,他們沒有)

萬一它有助於我使用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 2010-11-15 16:45:16

回答

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

不要忘記聯盟。 – 2010-11-15 16:44:21

+0

這是否意味着來自list_details的連接不包含在CASE WHEN EXISTS子句中,而僅僅來自主表本身? AS當我嘗試做(選擇1 FROM(list_definition查詢它似乎不喜歡它? – Dibstar 2010-11-15 16:55:28

0

你可以寫一個函數,該函數接受fund_id並返回一個適當的字符串值「緊急」或「非緊急」。