【问题标题】:SQL left join one table to multiple fields with prioritySQL left join 一张表到多个字段的优先级
【发布时间】:2020-05-22 07:06:28
【问题描述】:

例如如果我的数据表是

ID,ColumnA, ColumnB, ColumnC
--------------------------------
1,ABC,111,DEF
2,111,ABC,DEF
3,111,111,DEF

我还有一个映射表

Codekey, Result
---------------------------
ABC,OK1
DEF,OK2

我想要实现的是同时映射表左连接数据表与ColumnA,ColumnB和ColumnC。

如果ColumnA可以左连接映射表结果,则以ColumnA为准

否则,结果以ColumnB为准

如果ColumnA和ColumnB没有离开连接映射表结果,则以ColumnC为准。

所以左连接优先级是ColumnA>ColumnB>ColumnC

以下是我想要的结果:

 ID,ColumnA, ColumnB, ColumnC,Result
 -----------------------------------
 1,ABC,111,DEF,OK1 
 2,111,ABC,DEF,OK1
 3,111,111,DEF,OK2

有什么想法吗?我试图搜索旧问题,但似乎没有类似的情况。 谢谢! :)

【问题讨论】:

  • LEFT JOIN 三次。对于可乐、colb 和 colc。

标签: sql ms-access


【解决方案1】:
SELECT * FROM DATA D
LEFT JOIN MAPPING M ON (CASE WHEN D.ColumnA=M.Codekey THEN D.ColumnA=M.Codekey
WHEN D.ColumnB=M.Codekey THEN D.ColumnB=M.Codekey
WHEN D.ColumnC=M.Codekey THEN D.ColumnC=M.Codekey
END)

您可以使用 CASE WHEN 作为条件。

试试上面的代码,这会对你有所帮助。

【讨论】:

  • 感谢您的回答!我的工作仍然有问题,我已经在另一个新答案中发布了详细信息。非常感谢您能看一下,看看您是否可以对此发表评论。
【解决方案2】:

使用Nz可能更简单:

SELECT 
    DataTable.ID, 
    DataTable.ColumnA, 
    DataTable.ColumnB, 
    DataTable.ColumnC, 
    Nz([A]![Result],Nz([B]![Result],[C]![Result])) AS MapResult
FROM 
    ((DataTable 
LEFT JOIN MappingTable AS A 
    ON DataTable.ColumnA = A.Codekey) 
LEFT JOIN MappingTable AS B 
    ON DataTable.ColumnB = B.Codekey) 
LEFT JOIN MappingTable AS C 
    ON DataTable.ColumnC = C.Codekey;

【讨论】:

  • @Ken。 . .这是最好的答案——无论是在功能还是性能方面。
  • 您好 Gustav 和 Gordon,是的,它运行良好。确实感谢您的大力协助。再会。干杯,肯
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-10
  • 1970-01-01
相关资源
最近更新 更多