我在SQL中遇到了一个令人困惑的问题。不知何故,CASE语句中的JOIN返回TRUE和FALSE!
如果您运行以下(我正在使用SQL Server 2008),您将看到效果。 JOIN根据CASE语句创建2条记录。
如何阻止这种想法?
CREATE TABLE #table1(id int PRIMARY KEY, fieldA nvarchar(MAX))
INSERT INTO #table1
SELECT 1, 'ABC Airlines'
CREATE TABLE #table2(field_id int PRIMARY KEY, fieldB nvarchar(MAX))
INSERT INTO #table2
SELECT 1, 'ABC Airlines'
UNION
SELECT 2, '*** OTHER ***'
SELECT *
FROM #table1 t
JOIN #table2 t2 ON t2.fieldB = CASE WHEN t.fieldA <> t2.fieldB THEN '*** OTHER ***' ELSE t.fieldA END
答案 0 :(得分:1)
您似乎使用#table2.fieldB作为JOIN条件,因此您获得了2个值(&#39; ABC Airlines&#39;以及&#39;其他&#39;)。如果以这种方式更改查询,则可以实现预期结果
SELECT *
FROM #table1 t
JOIN #table2 t2 ON t.fieldA = CASE WHEN t.fieldA <> t2.fieldB THEN '*** OTHER ***' ELSE t2.fieldB END
答案 1 :(得分:0)
何时将数据插入#table1&amp; #table2然后你的表将如下所示
id fieldA
1 ABC航空公司
id fieldB
1 ABC航空公司
2 * OTHER *
现在,当您加入两个表时,您的情况表明,如果fieldA不等于fieldB,那么&#39; * OTHER &#39;否则为fieldA,因此当ABC航空公司&lt;&gt; 其他 时,您传递 < / strong> 其他* 作为替代品加入时。因此,对于两行,数据将匹配,您将获得两个结果。请根据您的要求更改案件条件
答案 2 :(得分:0)
为什么你不想要:
SELECT *
FROM #table1 t
JOIN #table2 t2 ON t.fieldA = t2.fieldB
在连接中使用case语句和不等式是一种不好的做法。根据您的最终结果,您想要的只是一个普通的内部联接。
答案 3 :(得分:0)
为什么不这样做?
SELECT *
FROM #table1 t JOIN
#table2 t2
ON t2.fieldB = t.fieldA OR t2.fieldB = '*** OTHER ***' ;
fieldA
NULL
apply
select *
from #table1 t apply
(select top 1 t2.*
from #table2 t2
where t2.fieldB = t.fieldA or t2.fieldB = '*** OTHER ***'
order by (case when t2.fieldB = t.fieldA then 1 else 2 end)
) t2;
时,这与您的逻辑不相同,但这似乎不是您数据的问题。
但我的猜测是,当根本不匹配时,您需要“ * OTHER * ”值。这不是你的逻辑会做的。如果是这种情况,那么{{1}}解决了问题:
{{1}}