我有以下两张table:
> select * from t1;
+-------+-------+
| text1 | text2 |
+-------+-------+
| a | NULL |
| b | c |
| d | e |
+-------+-------+
> select * from t2;
+-------+-------+-------+
| text1 | text2 | value |
+-------+-------+-------+
| a | NULL | 1 |
| a | NULL | 2 |
| a | NULL | 3 |
| b | c | 1 |
| b | c | 2 |
| d | e | 3 |
| f | g | 1 |
+-------+-------+-------+
我要做的是把两个表连接在一起,抓住最小值 value
对于每个 text1,text2
组合中的 t1
.
以下是我到目前为止的查询结果:
> select text1, text2, min(value)
> from t1
> natural join t2
> group by text1, text2
> order by text1 asc;
+-------+-------+------------+
| text1 | text2 | min(value) |
+-------+-------+------------+
| b | c | 1 |
| d | e | 3 |
+-------+-------+------------+
所以这几乎是我需要的,但正如你所看到的,我失去了 a
值,因为 text2
是 NULL
. 以下是我期待的结果:
+-------+-------+------------+
| text1 | text2 | min(value) |
+-------+-------+------------+
| a | NULL | 1 |
| b | c | 1 |
| d | e | 3 |
+-------+-------+------------+
那么,我的查询过滤掉那些 NULL
价值观?
请注意 t2
可能有其他的 text1
以及 text2
,例如。 ('a','z')
,我不想在我的结果,因此我有两个 text1
以及 text2
在我的 GROUP BY
条款。至少,这正是我想要的(显然有些东西没有像我希望的那样工作)。
注意,我使用的是mariadb版本10.3.8
3条答案
按热度按时间bttbmeg01#
你不能使用
NATURAL JOIN
或者USING()
在这里。使用空安全运算符<=>
在on子句中,哪个将NULL <=> NULL
至1
,而NULL = NULL
是NULL
:演示:http://sqlfiddle.com/#!9/3ca2a1/1号
czfnxgou2#
试着加入
<=>
空安全运算符。你现在所拥有的可以转化为:
作为
NULL = NULL
不是真的空的行不匹配,因此不进入结果。dsf9zpds3#
我想
natural join
问题出在哪里自然联接是内部联接的一个变体,其中联接条件隐式地存在于两个表的公共列上。在您的例子中,自然连接中的查询可以如下所示,它不会返回任何结果,因为它将尝试同时匹配a和b
在内部连接中也可以这样写,如下所示