【问题标题】:mySQL - How do I map/lookup one index to another and JOIN that other table?mySQL - 如何将一个索引映射/查找到另一个并加入另一个表?
【发布时间】:2020-07-28 19:47:42
【问题描述】:

我有两个具有不同索引的表,我可以(手动)将它们从一个映射到另一个:

table1             table2
ID  Name  Data     ID  Name  Data
1   A     X        4   C1    11
2   B     Y        5   B2    22
3   C     Z        6   A3    33

A 映射到 A3,B 映射到 B2,C 映射到 C1

我希望的结果集是:

t1.ID  t1.Name  t1.Data  t2.ID  t2.Name  t2.Data
1      A        X        6      A3       33
2      B        Y        5      B2       22
3      C        Z        4      C1       11

此查询失败,因为它无法识别“地图”:

SELECT *,
   CASE t1.name
      WHEN 'A' THEN 'A3'
      WHEN 'B' THEN 'B2'
      WHEN 'C' THEN 'C1'
      END AS map
FROM table1 AS t1
INNER JOIN table2 AS t2 ON (t2.name = map)

此查询失败,因为您不能在 ON 条件中使用 CASE:
[这个查询确实有效。我忘记了实际代码中的 END 。事实证明,这有很大的不同。]

SELECT *
FROM table1 AS t1
INNER JOIN table2 AS t2 ON (t2.name = (SELECT CASE t1.name
      WHEN 'A' THEN 'A3'
      WHEN 'B' THEN 'B2'
      WHEN 'C' THEN 'C1'
      END ) )

所以我的问题是:

1) 我应该使用哪些 Google 搜索字词来找到我需要的解决方案?

2) 实际的解决方案是什么?

3) 这可以在创建查找表的情况下完成吗(最简单的解决方案)?

【问题讨论】:

  • 您的查询运行良好:dbfiddle.uk/… 您是否尝试过?
  • 现在可以使用了。一旦我意识到我的实际问题是什么,我就添加了我缺少的 END。

标签: mysql sql join foreign-keys case


【解决方案1】:

where 子句无法访问在select 子句中定义的别名(因为基本上,前者在后者之前被评估)。

您希望在 join 条件中使用 case 表达式:

SELECT 
    t1.ID t1_id, 
    t1.name t1_name, 
    t1.data t1_data, 
    t2.ID t2_id, 
    t2.name t2_name, 
    t2.data t2_data
FROM table1 AS t1
INNER JOIN table2 AS t2 
    ON t2.name = CASE t1.name
      WHEN 'A' THEN 'A3'
      WHEN 'B' THEN 'B2'
      WHEN 'C' THEN 'C1'
    END

注意最好在select子句中使用别名来区分表中同名的列,如上图;

【讨论】:

    猜你喜欢
    • 2016-05-16
    • 2021-08-18
    • 1970-01-01
    • 2021-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    • 2011-01-26
    相关资源
    最近更新 更多