根据派生表中的NULL值更新表

时间:2014-07-24 14:56:36

标签: mysql

我想从这开始作为我的问题的基础,我可能已经知道了答案。

mysql> select a.i as AI, a.b as AB, b.i as BI, b.b as BB from a left join b using (i) union select a.i as AI, a.b as AB, b.i as BI, b.b as BB from b left join a using (i) where b.i = 5;
+------+----------+------+------+
| AI   | AB       | BI   | BB   |
+------+----------+------+------+
|    1 | Not NULL |    1 | 0    |
|    2 | Not NULL |    2 | 0    |
|    3 | Not NULL |    3 | 0    |
|    4 | Not NULL |    4 | 0    |
|    0 | Not NULL | NULL | NULL |
| NULL | NULL     |    5 | 0    |
+------+----------+------+------+
6 rows in set (0.00 sec)

无论如何,AB列在哪里= 0,基于在连接语句中BI = NULL的事实(因为该行显然不存在),然后反之,更新BB,其中AI = NULL?

我的直觉不是!!!由于几个原因我想要揭穿或验证。

  1. 出于同样的原因,您无法使用基于临时表算法的视图更新实际表。我不相信你可以从派生表的输出中更新表(至少不是以我正在寻找的方式)。

  2. 可能是最重要的原因,你不能根据不存在的其他东西更新某些东西(或者根据定义可能存在但是是未知值),因为没有isnull()函数你不能比较null。据说使用isnull()函数你需要有一个静态表,其中包含NULL,但是由于在这个特定实例中,NULL值仅在表连接在一起时才会生效(由于显而易见的匹配行的明显原因是不存在)。为了有效地执行此操作,您需要通过创建派生表来使值变为真实...这将我们引回到第1点。

  3. 如果这是可能的并且有人知道如何完成此操作请告诉我...如果可以的话,可以用一个语句更新这两个值吗?

    当我意识到基于知识和其他研究可能没用时,我大约有一半完成了这个命令。

    mysql> update a,b set b.b='n',a.b='n' where /*possibly a derived table here*/ = isnull((select i1 as 'a.i', i2 as 'b.i' from ((select a.i as i1, b.i as i2 from a left join b using (i) where isnull(b.i)=1) union (select a.i as i1, b.i as i2 from b left join a using (i) where isnull(a.i)=1) as derived1 where isnull(i1)) /*maybe an or statement of some kind and another two derived tables here equalling each other*/ ;

    根据我的陈述,似乎我需要另一个派生表或3以完整的方式完成声明...虽然我不相信它可以根据我的尝试直到现在。

    也有可能我已经这么久了,我不再直接思考了。

    在任何情况下,我都提前感谢您的帮助(即使这是可能的,这是您需要的方向)。

    如果我需要提供任何进一步的信息,请告诉我。

    P.S。我不想过分强调我未完成的MySQL语句,因为它甚至可能不是我需要去的方向......因而令人困惑。

1 个答案:

答案 0 :(得分:0)

我找到了部分答案。如果有人可以延长,请告诉我。由于升级到centos 7,我也不得不重新安装所有东西。

其中:

    mysql> (select b.i as '1',b.b as '2',a.i as '3',a.b as '4' from a left join b   using (i)) union (select b.i as '1',b.b as '2',a.i as '3',a.b as '4' from b left join a using (i)) order by 1;
    +------+--------------+------+--------------+
    | 1    | 2            | 3    | 4            |
    +------+--------------+------+--------------+
    | NULL | NULL         |    1 | 何もない      |
    |    2 | 何もない      |    2 | 何もない      |
    |    3 | 何もない      |    3 | 何もない      |
    |    4 | 何もない      |    4 | 何もない      |
    |    5 | 何もない      |    5 | 何もない      |
    |    6 | 何もない      | NULL | NULL         |
    +------+--------------+------+--------------+
    6 rows in set (0.00 sec)

该命令最终将使用相同的连接语法:

    mysql> update a right join b using (i) set b.b = 'ある' where isnull(a.i) or isnull(b.i);
    Query OK, 1 row affected (0.01 sec)
    Rows matched: 1  Changed: 1  Warnings: 0

在这种情况下,MySQL能够在a中正确找到b中缺少匹配项的行并替换指定的数据。

    mysql> (select b.i as '1',b.b as '2',a.i as '3',a.b as '4' from a left join b using (i)) union (select b.i as '1',b.b as '2',a.i as '3',a.b as '4' from b left join a using (i)) order by 1;
    +------+--------------+------+--------------+
    | 1    | 2            | 3    | 4            |
    +------+--------------+------+--------------+
    | NULL | NULL         |    1 | 何もない      |
    |    2 | 何もない      |    2 | 何もない      |
    |    3 | 何もない      |    3 | 何もない      |
    |    4 | 何もない      |    4 | 何もない      |
    |    5 | 何もない      |    5 | 何もない      |
    |    6 | ある         | NULL | NULL         |
    +------+--------------+------+--------------+
    6 rows in set (0.00 sec)

我不确定这是否是这个问题的最佳答案,或者它可以更详细。这是我需要做更多研究的事情。如果这是最好的答案,请告诉我。如果没有,有人知道最佳答案,请告诉我。