基于列值的多个条件条件联接表

Join table on multiple criteria condition based on column value

提问人:2020db9 提问时间:11/17/2023 最后编辑:philipxy2020db9 更新时间:11/17/2023 访问量:37

问:

select
  a.Name
  a.Year
  a.Month
  a.Day
  b.Price
into #test_table
from #tableA as a
left join #tableB as b on
   a.Name = b.Name
   and a.Year = b.Year
   and a.Month = b.Month
   and a.Day = b.Day

在某些情况下,表 B 中可能缺少 Month 和/或 Day,我试图找到一种方法来仅连接可用值(例如,当 Month 和 Day 为 null 或空白时,仅在 Name 和 Year 上)。我在想,一个案例-当的方法可能是最佳的;但是,当我尝试以下方法时,我得到“'='附近的语法不正确”和“'else'附近的语法不正确”

select
  a.Name
  a.Year
  a.Month
  a.Day
  b.Price
into #test_table
from #tableA as a
left join #tableB as b on
   case when a.Month = '' then a.Name = b.Name and a.Year = b.Year
   else a.Name = b.Name and a.Year = b.Year and a.Month = b.Month and a.Day = b.Day

我不想在 Month 或 Day 为 Null/空白时排除记录。

我错过了什么?

什么是正确的?

sql-server 左联接

评论

0赞 siggemannen 11/17/2023
这不是有效的方法,但你总是可以做到的: .只要确保某些值不是 null,这样您就不会得到很大的交叉连接and a.Day = ISNULL(b.Day, a.Day)
0赞 Stu 11/17/2023
case是一个表达式,它返回一个标量值,而不是另一个表达式。不要在连接表达式中使用不可优化的表达式,请使用标准和/或逻辑。isnull
0赞 2020db9 11/17/2023
如果 Day 为 null,这会@siggemannen排除记录吗?我不想排除记录
1赞 siggemannen 11/17/2023
不,它不会,因为你回退到 a.day = a.day,这总是正确的。试一试
0赞 philipxy 11/17/2023
请提出 1 个经过研究的非重复问题。请询问 1 个错误的查询/函数,并提供强制性的最小可重现示例,包括为什么您认为它应该返回其他内容,或者不确定在第一个子表达式中您没有得到您期望或卡住的地方,通过参考权威文档进行证明,或者询问您的总体目标,给出您可以用理由和最小可现示例来做的工作部分--那么被误解的代码就不属于了。但是,请首先询问意外行为,因为误解会妨碍您的目标。如何咨询帮助中心 基本问题是常见问题解答。

答:

1赞 Cetin Basoz 11/17/2023 #1
select
  a.Name
  a.Year
  a.Month
  a.Day
  b.Price

into #test_table
from #tableA as a
left join #tableB as b on
   a.Name = b.Name and a.Year = b.Year
   and (b.Month is null or a.Month = b.Month)
   and (b.Day is null or a.Day = b.Day);