【问题标题】:SQL: Join two tables with different type of columnsSQL:连接具有不同类型列的两个表
【发布时间】:2024-01-20 10:25:01
【问题描述】:

我有两个包含以下列的表格:

表 1:

OrderID    RetailerName    SKUs (varchar)    OrderDate
-------------------------------------------------------
123        ABC             1,2               2016-11-11
124        DEF             3,4               2016-11-12

表 2:

SKU(int)          Product
--------------------------
1                 xx
2                 xy
3                 xz
4                 yx

预期输出:

OrderID   RetailerName   OrderDate   Product
--------------------------------------------
  123     ABC            2016-11-11  xx
  123     ABC            2016-11-11  xy
  124     DEF            2016-11-12  xz
  124     DEF            2016-11-12  yx

如何根据SKU 连接这两个表,即如何比较 table1 中的 SKUs (varchar) 列与 table2 中的 SKU (int) 列?

【问题讨论】:

  • 请不要标记多个RDBMS,只标记您真正使用的一个。
  • 至于您的问题,解决方案是修复您的设计。不要在一行的一列中存储多个值;你应该有多行。修复设计,这个问题就不存在了。你在这里所做的是打破了范式的基本规则之一。
  • 能否请edit 提出您的问题并添加预期的输出,并用您正在使用的rdbms 对其进行标记?
  • @Mureinik 我已经添加了预期的输出,我正在使用 MySql DB 请帮帮我。
  • 仍然不知道您使用的是什么 dbms - Access、MySQL、SQLServer、Oracle?不能按设计直接加入这些表。 SKUs 字段中允许有多少个 SKU?这是一个逗号分隔值字符串?

标签: mysql sql csv join casting


【解决方案1】:

我建议将架构规范化为@Sodmond suggested。但是,如果这不是一个选项,您可以使用 find_in_set 作为连接条件 - 它会将 int 从 table2 隐式转换为字符:

SELECT t1.OrderID, RetailerName, OrderDate, Product
FROM   table1 t1
JOIN   table2 t2 ON FIND_IN_SET(t2.sku, t1.skus) > 0

【讨论】:

  • Find_In_Set 是 MySQL 函数。如果 dbms 是 Access,它将不起作用。
  • @June7 OP 正在使用 MySQL。
  • 你不需要先投射 t2.sku 吗?
  • @reynoldsbj MySQL 应该为您隐式处理转换,尽管我认为自己显式执行转换而不信任此处的数据库会更好
  • 感谢@Mureinik,我使用 find_in_set() 得到了输出......是的,而且 Mureinik 提到 Mysql 隐式处理强制转换是正确的,早些时候我尝试使用“=”直接加入时隐含地将 varchar 强制为 int 并仅与 varchar 中的第一个 val 进行比较,即“1,2”中的 1
【解决方案2】:

您需要重新设计架构,检查我如何为您重新创建表。

table1:

OrderID      RetailerName          SKUs(int)              OrderDate
123          ABC                   1                        2016-11-11
123          ABC                   2                        2016-11-11
124          DEF                   3                        2016-11-12
124          DEF                   3                        2016-11-12


table2:

SKU(int)          Product
1                 xx
2                 xy
3                 xz
4                 yx

避免在 SKU 字段中存储多个值,然后您将能够使用连接查询。

【讨论】:

  • 除了应该有表 Retailers、Products、Orders、OrderDetails。 RetailerID 将作为外键保存到 Orders 中。 OrderID 和 ProductID 将作为外键保存到 OrderDetails 中。零售数据库的基本多对多关系。
  • can't change the table design 难道没有办法转换 Varchar 并将其与 int 进行比较?
  • @AmerSufi 您可以使用您用来与数据库对话的编程语言来做到这一点。您使用哪种语言?
最近更新 更多