我想从这开始作为我的问题的基础,我可能已经知道了答案。
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?
我的直觉不是!!!由于几个原因我想要揭穿或验证。
出于同样的原因,您无法使用基于临时表算法的视图更新实际表。我不相信你可以从派生表的输出中更新表(至少不是以我正在寻找的方式)。
可能是最重要的原因,你不能根据不存在的其他东西更新某些东西(或者根据定义可能存在但是是未知值),因为没有isnull()函数你不能比较null。据说使用isnull()函数你需要有一个静态表,其中包含NULL,但是由于在这个特定实例中,NULL值仅在表连接在一起时才会生效(由于显而易见的匹配行的明显原因是不存在)。为了有效地执行此操作,您需要通过创建派生表来使值变为真实...这将我们引回到第1点。
如果这是可能的并且有人知道如何完成此操作请告诉我...如果可以的话,可以用一个语句更新这两个值吗?
当我意识到基于知识和其他研究可能没用时,我大约有一半完成了这个命令。
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语句,因为它甚至可能不是我需要去的方向......因而令人困惑。
答案 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)
我不确定这是否是这个问题的最佳答案,或者它可以更详细。这是我需要做更多研究的事情。如果这是最好的答案,请告诉我。如果没有,有人知道最佳答案,请告诉我。