【问题标题】:Using CASE expression in condition of Join在 Join 条件下使用 CASE 表达式
【发布时间】:2021-01-10 02:39:00
【问题描述】:

假设有 2 个表 'Source' 和 'Name'。表的记录如下:

源表

名称表

我的 SQL 查询是:

select s.* 
from source s 
join name n on 
    s.Market = n.Market
    and s.Owner = n.Owner
    and s.Name = n.Name
    and Source = case Source when 'State' then 'State' else 'Data' end

它返回 2 条记录,但我必须使用“状态”(如果存在)并忽略“数据”,如果“状态”不存在则使用“数据”。

请帮帮我。

提前致谢。

预期结果:

【问题讨论】:

  • 在 ON 子句中使用 AND/OR 结构而不是 case 表达式通常会更好。
  • 已更新。请检查。
  • 是你预期的结果吗?还是您当前的错误结果?那个case表达式背后的逻辑是什么?它是加入条件的一部分吗? where 子句,如果是,它试图做什么?
  • 我已经更新了我的预期结果。案例表达式的逻辑将类似于如果在表中存在“状态”,则只有该记录将返回并忽略具有“数据”的第二条记录,但如果“状态”不存在,则它将使用“数据”。是的,它是连接条件的一部分。
  • 好的,我想我明白了,但是您可能希望扩展您的示例数据以包含不存在“状态”记录的情况 - 因为目前您的示例数据未涵盖这些情况。如果您可以将数据显示为格式化文本而不是图像,也可供将来参考。创建测试数据的 DDL/DML 语句将是理想的。

标签: sql sql-server tsql join stored-procedures


【解决方案1】:

你可以在没有加入的情况下做到这一点。
使用FIRST_VALUE()窗口函数和EXISTS

SELECT DISTINCT 
  s.Market, s.Owner, s.Name,
  FIRST_VALUE(s.Source) OVER (PARTITION BY s.Market, s.Owner, s.Name ORDER BY CASE WHEN s.Source = 'State' THEN 1 ELSE 2 END) Source 
FROM Source s
WHERE EXISTS (SELECT 1 FROM Name n WHERE n.Market = s.Market AND n.Owner = s.Owner AND n.Name = s.Name) 

请参阅demo
结果:

> Market | Owner | Name | Source
> :----- | :---- | :--- | :-----
> A      | ADMIN | NM_1 | State 

【讨论】:

    猜你喜欢
    • 2021-01-11
    • 1970-01-01
    • 2014-08-29
    • 2021-01-15
    • 1970-01-01
    • 2018-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多