我有一个包含完美定义项目的表和一个可能含糊/贪婪的订单的第二个表,因为NULL需要此参数的所有可用值。
items
+-----------------------+
| item_id | color | size |
|---------+-------+------|
| 1 | blue | 8 |
| 2 | red | 6 |
| 3 | green | 7 |
| 4 | black | 6 |
+------------------------+
orders
+-------------------------+
| order_id | color | size |
|----------+-------+------|
| 1 | red | 6 |
| 2 | green | 8 |
| 3 | NULL | 6 |
| 4 | blue | NULL |
| 5 | NULL | NULL |
+-------------------------+
是否有一种有效的方法来生成填写所有订单所需的完整项目列表?
+--------------------+
| order_id | item_id |
|----------+---------|
| 1 | 2 |
| 3 | 2 |
| 3 | 4 |
| 4 | 1 |
| 5 | 1 |
| 5 | 2 |
| 5 | 3 |
| 5 | 4 |
+--------------------+
在我看来,INNER JOIN应该能够做到这一点,但是这样的事情显然不会考虑将NULL值作为 orders 表中的贪心通配符的可能性:
SELECT order_id, item_id
FROM orders
INNER JOIN items ON orders.color = items.color AND orders.size = items.size
有什么想法吗?
答案 0 :(得分:3)
尝试以下方法:
SELECT order_id, item_id
FROM orders
INNER JOIN items ON (orders.color IS NULL OR orders.color = items.color)
AND (orders.size IS NULL OR orders.size = items.size)
如果这有帮助,或者如果我误解了这个问题,请告诉我。
答案 1 :(得分:1)
如果您重写JOIN
的条件,则可以获得所需的结果:
SELECT order_id, item_id
FROM orders
JOIN items
ON ((orders.color = items.color OR orders.color IS NULL)
AND (orders.size = items.size OR orders.size IS NULL))
但是,订单表应该看起来更像是此查询的结果而不是当前订单表。
答案 2 :(得分:1)
您可以使用IFNULL
功能:
SELECT order_id, item_id
FROM orders
JOIN items ON IFNULL(orders.color, items.color) = items.color
AND IFNULL(orders.size, items.size) = items.size
如果order中的值为null,那么它将使用items中的值(从而匹配)。