【问题标题】:MySQL insert category rowsMySQL插入类别行
【发布时间】:2020-05-18 09:24:20
【问题描述】:

我很难在标题中描述问题,更不用说寻找可能存在的解决方案了,所以请原谅,或者指出我的主题。我需要 pad 行,所以每个类别有 4 行,如下面的简化场景所示:

mysql> select * from a;
+-------+
|  Num  |
+-------+
|     1 |
|     2 |
|     3 |
|     4 |
+-------+
mysql> select * from b;
+----------+------+------+
| Category | Num  | Data |
+----------+------+------+
| X        |    2 |   10 |
| X        |    3 |   12 |
| X        |    4 |    8 |
| Y        |    1 |    0 |
| Y        |    2 |   19 |
| y        |    3 |   15 |
| y        |    4 |   22 |
| Z        |    2 |   10 |
+----------+------+------+

我需要的结果是每个类别总是 4 行(表 b 总是每个类别有 Num = 1、2、3 或 4 之一),为填充行设置 data = null:

mysql> select * from c;
+----------+------+------+
| Category | Num  | Data |
+----------+------+------+
| X        |    1 | NULL |
| X        |    2 |   10 |
| X        |    3 |   12 |
| X        |    4 |    8 |
| Y        |    1 |    0 |
| Y        |    2 |   19 |
| y        |    3 |   15 |
| y        |    4 |   22 |
| Z        |    1 | NULL |
| Z        |    2 |   10 |
| Z        |    3 | NULL |
| Z        |    4 | NULL |
+----------+------+------+

我人为地创建了表 a,因为我认为它可能有助于 (INSERT) 查询?!

【问题讨论】:

    标签: mysql sql select sql-insert


    【解决方案1】:

    您可以cross joina 与表b 中的所有可用类别,然后将表bleft join 一起带入。

    select 
        c.category,
        a.num,
        b.data
    from a
    cross join (select distinct category from b) c
    left join b on b.category = c.category and b.num = a.num
    

    您可以轻松地将其转换为对另一个表的 insert 查询:

    insert into c(category, num, data)
    select 
        c.category,
        a.num,
        b.data
    from a
    cross join (select distinct category from b) c
    left join b on b.category = c.category and b.num = a.num
    

    【讨论】:

    • @Akina:OP 没有提到这一点,所以我现在不太担心。我认为他们主要是在这里寻找cross join/left join 逻辑。
    • @GMB thx 这么快的答案,我现在正试图消化。它适用于我的简化场景,很快就会应用于实际情况。尽管在建议的答案中使用“b”作为临时查询让我有一段时间,因为这是所需输出表的名称,但答案教会了我仍然需要学习的东西,即使在使用 SQL 之后几年了;-)
    • @Akina:感谢您的谨慎,尽管我需要反思您的警告是关于什么的。您是说 GMB 的解决方案依赖于表 a 和/或 b 的物理行排序吗?如果是关于输出行的物理顺序,这与我的问题无关。
    • @MatthiasOtto 你是说 GMB 的解决方案取决于表 a 和/或 b 的物理行顺序吗? o_O 我的意思是 'Y''y' 可能是不等于...
    • @Akina & GMB:区分大小写对我来说不是问题。我以为 collat​​ion 是关于排序数据,抱歉我的无知。
    【解决方案2】:

    你需要左连接

    select a.num, b.category , b.data
    from tablea a
    left join tableb b on a.num = b.num 
    

    用于插入

    insert into tablec (num, category, data)
    select a.num, b.category , b.data
    from tablea a
    left join tableb b on a.num = b.num 
    

    如果需要更新 exing 行

    update tablec c
    inner join ( 
    select a.num, b.category , ifnull(b.data,0)
    from tablea a
    left join tableb b on a.num = b.num ) t t.num= c.num  and t.category = c.category
    set data  = t.data
    

    【讨论】:

    • thx,我在 SELECT 中将 "tablea/b" 替换为 "a/b" 以使其无错误但没有得到所需的结果:-( 它基本上选择了表 b(在 MySQL 中)。
    • 检查得更好.. num 上有连接,并且 qeuery 必须从两个表中返回值.. 对于不匹配的行,使用 null 值
    猜你喜欢
    • 2016-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-13
    • 2013-07-27
    • 1970-01-01
    • 2014-04-05
    相关资源
    最近更新 更多