用exists替换In子句

时间:2010-11-15 16:39:09

标签: sql sql-server sql-server-2005 tsql

HI Gurus, 我想用exists替换一个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)连接到list_details.id上的donation_fund_allocation = 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

2 个答案:

答案 0 :(得分:1)

您需要将exists调用与外部查询相关联。如上所述,您只是询问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的表别名的位置

答案 1 :(得分:0)

您可以编写一个函数,该函数接受fund_id并返回适当的字符串值“emergency”或“non-emergency”。