【发布时间】:2021-08-17 16:07:03
【问题描述】:
我有以下表格:
SELECT * FROM medicine
| id | name | producer |
+----+-------------+----------+
| 1 | aspirin | pharma |
| 2 | cetamol | tamiko |
| 3 | brufen | pharma |
| 4 | cetacodeine | adamco |
| 5 | actifed | tamiko |
| 6 | claritin | tamiko |
+----+-------------+----------+
SELECT * FROM liquid
+-----+------+-------+
| lid | m_id | price |
+-----+------+-------+
| l1 | 2 | 1000 |
| l2 | 3 | 1500 |
| l3 | 4 | 3000 |
| l4 | 5 | 2000 |
| l5 | 6 | 1800 |
+-----+------+-------+
SELECT * FROM tablet
+-----+------+-------+
| tid | m_id | price |
+-----+------+-------+
| t1 | 1 | 900 |
| t2 | 2 | 600 |
| t3 | 3 | 1200 |
| t4 | 5 | 2000 |
+-----+------+-------+
其中最后两个表中的 m_id 具有引用第一个表中的 id 的外键。
我正在尝试列出仅由生产商 tamiko 生产的液态药物的 lid 和 name 执行以下语句将导致包含从子查询返回的空值的行,我想省略
SELECT lid, (SELECT name FROM medicine WHERE liquid.m_id=medicine.id AND medicine.producer='tamiko') AS byTamiko FROM liquid;
+-----+----------+
| lid | byTamiko |
+-----+----------+
| l1 | cetamol |
| l2 | NULL |
| l3 | NULL |
| l4 | actifed |
| l5 | claritin |
+-----+----------+
所以我做了一些尝试,使用HAVING 子句似乎是一个解决方案
SELECT lid, (SELECT name FROM medicine WHERE liquid.m_id=medicine.id AND medicine.producer='tamiko') AS byTamiko FROM liquid HAVING byTamiko IS NOT NULL;
| lid | byTamiko |
+-----+----------+
| l1 | cetamol |
| l4 | actifed |
| l5 | claritin |
+-----+----------+
但是,我的老师不同意 HAVING 子句只能与聚合函数和 GROUP BY 语句一起使用。我现在很困惑这是否是适当的用法?究竟发生了什么使它起作用?
注意:我必须只使用子查询而不是任何JOIN 或其他语句来执行此查询。
注意2:请注意,这不是重复的,我试图解释它是如何工作的,以及它是否正确使用。
【问题讨论】:
-
实际上,您的子查询应该替换为
JOIN运行一次,而不是针对外部表的每一行。如果您正在运行子查询以进行学习练习,请忽略此建议 -
@Parfait 是的,我运行它是为了学习。
标签: mysql sql subquery filtering having-clause