[英]subquery: is it good practise to use having clause to filter out rows of outer query that contains subquery's null values
我有以下表格:
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生產的液體葯物的蓋子和名稱執行以下語句將導致包含從子查詢返回的 null 值的行,我想省略
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:請注意,這不是重復的,我試圖解釋它是如何工作的以及它是否是正確的用法。
這不太合適。
在 SQL 標准having
有定義為聚合后的過濾,而where
是聚合前的過濾(如果有任何聚合)。
MySQL 對此進行了擴展,以允許having
非聚合查詢。 此擴展允許您在不使用子查詢的情況下過濾列別名。 但是您應該在聚合之前使用where
進行過濾。
所以它應該看起來像這樣?
SELECT lid, (
SELECT name
FROM medicine
WHERE liquid.m_id=medicine.id AND medicine.producer='tamiko'
) AS byTamiko
FROM liquid
WHERE byTamiko IS NOT NULL;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.