Mysql 如何连接两个表并匹配空值
我有这些桌子:Mysql 如何连接两个表并匹配空值,mysql,sql,Mysql,Sql,我有这些桌子: mysql> select bookId, productId, clusterId, symbolId, shares from SymbolAimOrderStats where bookId = "BFM"; +--------+-----------+-----------+----------+--------+ | bookId | productId | clusterId | symbolId | shares | +--------+-----------
mysql> select bookId, productId, clusterId, symbolId, shares from SymbolAimOrderStats where bookId = "BFM";
+--------+-----------+-----------+----------+--------+
| bookId | productId | clusterId | symbolId | shares |
+--------+-----------+-----------+----------+--------+
| BFM | NULL | NULL | NULL | 522 |
| BFM | BFM | NULL | NULL | 522 |
| BFM | BFM | BFM | NULL | 522 |
| BFM | BFM | BFM | 0000f52a | 506 |
| BFM | BFM | BFM | 00010a4d | 2 |
| BFM | BFM | BFM | 00010a7c | 1 |
| BFM | BFM | BFM | 00010a89 | 3 |
| BFM | BFM | BFM | 00010ba3 | 3 |
| BFM | BFM | BFM | 00013c7e | 3 |
| BFM | BFM | BFM | 00013c97 | 4 |
+--------+-----------+-----------+----------+--------+
10 rows in set (0.00 sec)
mysql> select bookId, productId, clusterId, symbolId, shares from SymbolOrderStats where bookId = "BFM";
+--------+-----------+-----------+----------+--------+
| bookId | productId | clusterId | symbolId | shares |
+--------+-----------+-----------+----------+--------+
| BFM | NULL | NULL | NULL | 393 |
| BFM | BFM | NULL | NULL | 393 |
| BFM | BFM | BFM | NULL | 393 |
| BFM | BFM | BFM | 0000f52a | 377 |
| BFM | BFM | BFM | 00010a4d | 2 |
| BFM | BFM | BFM | 00010a7c | 1 |
| BFM | BFM | BFM | 00010a89 | 3 |
| BFM | BFM | BFM | 00010ba3 | 3 |
| BFM | BFM | BFM | 00013c7e | 3 |
| BFM | BFM | BFM | 00013c97 | 4 |
+--------+-----------+-----------+----------+--------+
10 rows in set (0.00 sec)
我想联接这些表并从这两个表中获取shares列,包括具有空值的行
我知道你不能匹配空值,所以这当然不能给出我想要的结果:
mysql> select a.bookId, a.productId, a.clusterId, a.symbolId, a.shares, o.shares
from SymbolAimOrderStats a
left join SymbolOrderStats o
on a.bookId = o.bookId and a.productId = o.productId and
a.clusterId = o.clusterId and a.symbolId = o.symbolId where a.bookId = "BFM";
所以我试过这个:
mysql> select a.bookId, a.productId, a.clusterId, a.symbolId, a.shares, o.shares
from SymbolAimOrderStats a
left join SymbolOrderStats o
on a.bookId = o.bookId and
(a.productId = o.productId or (a.productId is null and o.productId is null)) and
(a.clusterId = o.clusterId or (a.clusterId is null and o.clusterId is null)) and
(a.symbolId = o.symbolId or (a.symbolId is null or a.symbolId is null))
where a.bookId = "BFM";
但这也不能满足我的需求。有人能告诉我怎样才能得到我想要的结果集吗
这是我想要的回报:
+--------+-----------+-----------+----------+--------+--------+
| bookId | productId | clusterId | symbolId | shares | shares |
+--------+-----------+-----------+----------+--------+--------+
| BFM | NULL | NULL | NULL | 522 | 393 |
| BFM | BFM | NULL | NULL | 522 | 393 |
| BFM | BFM | BFM | NULL | 522 | 393 |
| BFM | BFM | BFM | 0000f52a | 506 | 377 |
| BFM | BFM | BFM | 00010a4d | 2 | 2 |
| BFM | BFM | BFM | 00010a7c | 1 | 1 |
| BFM | BFM | BFM | 00010a89 | 3 | 3 |
| BFM | BFM | BFM | 00010ba3 | 3 | 3 |
| BFM | BFM | BFM | 00013c7e | 3 | 3 |
| BFM | BFM | BFM | 00013c97 | 4 | 4 |
+--------+-----------+-----------+----------+--------+--------+
10 rows in set (0.00 sec)
这是在MySQL中。可能
NULL
值的最后一个条件应该使用和而不是或:
select a.bookId, a.productId, a.clusterId, a.symbolId, a.shares, o.shares
from SymbolAimOrderStats a
left join SymbolOrderStats o
on a.bookId = o.bookId and
(a.productId = o.productId or (a.productId is null and o.productId is null)) and
(a.clusterId = o.clusterId or (a.clusterId is null and o.clusterId is null)) and
(a.symbolId = o.symbolId or (a.symbolId is null and o.symbolId is null))
------------------------------------------------^ --^
where a.bookId = "BFM";
如果需要有意义的NULL
,请将其更改为有意义的内容
select a.bookId, a.productId, a.clusterId, a.symbolId, a.shares, o.shares
from SymbolAimOrderStats a
left join SymbolOrderStats o
on a.bookId = o.bookId
and ifnull( a.productId, @dummy ) = ifnull( o.productId, @dummy )
and ifnull( a.clusterId, @dummy ) = ifnull( o.clusterId, @dummy )
and ifnull( a.symbolId, @dummy ) = ifnull( o.symbolId, @dummy )
where a.bookId = "BFM";
其中,@dummy
是任何值,只要它不与非空值冲突,以消除将null
与非null
匹配的可能性,并且是与字段相同的数据类型。如果productId、clusterId和symbolId是不同的类型,则需要三个伪变量。或者您可以在那里硬编码值,但这不是一个好的做法
然而,这就提出了一个问题:如果表中的NULL
值实际上意味着什么,为什么它们还没有设置为这些值?我并不想批评——可能有完全合理的理由让它们保持NULL
。但是,您可能忽略了改进数据的机会。您还没有向我们展示您的需求。请发布期望的结果。对不起,我认为这是清楚的。我已经用这些信息更新了我的问题。而且它应该是o.symbol,在和你们两个-2个愚蠢的打字错误之后。数据是通过使用汇总选择的查询创建的。空值是所有符号、簇和符号或产品、簇和符号的集合。是的,创建数据的代码可以将空值更改为其他内容,但是有很多现有代码期望空值指示聚合。