【问题标题】:Transact-SQL: Join two tables with optional join-attributes in Table 2Transact-SQL:使用表 2 中的可选连接属性连接两个表
【发布时间】:2019-02-22 07:46:34
【问题描述】:

我在为以下情况定义 Transact-SQL (SQL Server) 语句时遇到问题: 表 1 和表 2 有 2 个,每个表都有一个 ID(主键)和 3 个属性 A、B、C。 表 1 中所有属性都是必需的,表 2 中只有 A 是必需的。

这意味着表 2 中或多或少是特定的记录。

我要做的是通过为表1的记录找到表2中最具体的记录来连接这两个表

我希望下面的图片是一个可以理解的问题描述:

我尝试过在 case 语句之后加入,但总是出现语法错误。

要指定问题: 我的第一种方法是像这样用 ON Case 定义连接表达式,当然这是行不通的,但是:

  SELECT * FROM Table T1
     JOIN Table T2 ON CASE
        WHEN T1.A = T2.A AND T1.B=T2.B AND T1.C=T2.C
        THEN T1.A = T2.A AND T1.B=T2.B AND T1.C=T2.C
        WHEN T1.A = T2.A AND T1.B=T2.B AND T1.C!=T2.C
        THEN T1.A = T2.A AND T1.B=T2.B
        WHEN T1.A = T2.A AND T1.B!=T2.B AND T1.C!=T2.C
        THEN T1.A = T2.A
        ELSE 0 

因此,我只需要一个方法,而不是一个完整的解决方案。

【问题讨论】:

  • 这是作业吗?
  • “家庭作业”是什么意思?
  • 请阅读How to Ask并采取行动(尤其是关于家庭作业),点击谷歌搜索“stackexhange homework”和向下投票箭头鼠标悬停文本。请展示一些有理由的工作,解释你遇到的第一个地方并提出一个具体的问题。请use text, not images/links, for text (including code, tables & ERDs)。使用图像仅是为了方便补充文本和/或无法在文本中给出的内容。如果您有代表,请使用编辑功能内联,而不是链接 - 使您的帖子独立。请阅读并采取行动minimal reproducible example
  • Ah ok^^ -> 屏幕截图中显示了预期结果,但我将编辑我的问题。第二个 - 不,我不是学生(所以没有作业)

标签: sql-server join case exists


【解决方案1】:

您可以在相同属性上连接表,同时将空值视为通配符。

然后使用窗口函数row_number 得到每个Table1 ID 的最佳匹配

SELECT ID1, ID2
FROM
(
    SELECT t1.ID AS ID1, t2.ID AS ID2
    , ROW_NUMBER() OVER (PARTITION BY t1.ID ORDER BY (IIF(t2.AttributeA IS NULL,0,1) + IIF(t2.AttributeB IS NULL,0,1) + IIF(t2.AttributeC IS NULL,0,1)) DESC, t2.AttributeA DESC, t2.AttributeB DESC, t2.AttributeC DESC) AS rn
    FROM Table1 AS t1
    LEFT JOIN Table2 AS t2
       ON ((t2.AttributeA = t1.AttributeA OR t2.AttributeA IS NULL) AND
           (t2.AttributeB = t1.AttributeB OR t2.AttributeB IS NULL) AND
           (t2.AttributeC = t1.AttributeC OR t2.AttributeC IS NULL))
) q
WHERE rn = 1
ORDER BY ID1;

您可以在 rextester here 上测试 SQL

【讨论】:

  • 是的,谢谢 - ON 子句之后的方法是我正在寻找的方法。并且通过正确的顺序,我得到了最指定的表 2 的记录。谢谢!
  • @MisterD 我怀疑你会这么做。对于这样的 SQL 技巧,有时需要找到正确的 google 关键字。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-28
  • 2012-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多