PostgreSQL LEFT JOIN ON AND 查询语句遇到的问题
问题说明
在工作中遇到一个问题,PostgreSQL 关联多张表进行数据查询时,遇到了一个问题,使用 LEFT JOIN ON 关联多张表,并使用AND设置了多个条件,发现返回的接口与预期不一致。
问题复现
创建表
创建orders表
CREATE TABLE orders (
order_id SERIAL PRIMARY KEY,
customer_id INT NOT NULL,
product TEXT NOT NULL,
quantity INT NOT NULL
);
创建customers表
CREATE TABLE customers (
customer_id SERIAL PRIMARY KEY,
customer_name TEXT NOT NULL,
customer_email VARCHAR(255) NOT NULL
);
模拟测试数据
INSERT INTO customers (customer_name, customer_email) VALUES ('张三', 'zhangsan@example.com');
INSERT INTO customers (customer_name, customer_email) VALUES ('李四', 'lisi@example.com');
INSERT INTO orders (order_id, customer_id, product, quantity) VALUES (1, 1, '产品1', 10);
INSERT INTO orders (order_id, customer_id, product, quantity) VALUES (2, 1, '产品2', 20);
INSERT INTO orders (order_id, customer_id, product, quantity) VALUES (3, 1, '产品3', 5);
INSERT INTO orders (order_id, customer_id, product, quantity) VALUES (4, 2, '产品1', 10);
INSERT INTO orders (order_id, customer_id, product, quantity) VALUES (5, 2, '产品2', 20);
执行查询语句
SELECT orders.order_id, customers.customer_name, orders.product, orders.quantity
FROM orders
LEFT JOIN customers
ON orders.customer_id = customers.customer_id
AND orders.quantity = 10;
返回结果
| order_id | customer_name | product | quantity |
|---|---|---|---|
| 1 | 张三 | 产品1 | 10 |
| 2 | 产品2 | 20 | |
| 3 | 产品3 | 5 | |
| 4 | 李四 | 产品1 | 10 |
| 5 | 产品2 | 20 |
问题分析
疑问:
为什么会查询出来5条数据呢,不应该是2条数据吗?
分析:
在这个查询语句中,LEFT JOIN 连接条件中包含了 orders.quantity = 10,这就意味着它只会返回所有购买量为10的订单与相应的客户,而对于购买量不为10的订单,它们会返回 NULL 值。因为AND只适用于两个条件同时满足,而你的查询需要满足一个条件即可,所以这个查询结果缺少一些订单并且并不符合预期。
问题解决
根据以上的查询语句,我们是想要获取orders.quantity = 10的结果,所以应该使用的是WHERE而不是AND来过滤结果。
如果想要返回所有订单与相应的客户,并且仅筛选出购买量为10的订单,可以采用以下方式:
SELECT orders.order_id, customers.customer_name, orders.product, orders.quantity
FROM orders
LEFT JOIN customers
ON orders.customer_id = customers.customer_id
WHERE orders.quantity = 10;
在查询语句中使用 WHERE 子句来筛选购买数量为10的订单,这样可以保证返回所有订单与相应的客户,并且只选择购买数量为10的订单。
返回结果:
| order_id | customer_name | product | quantity |
|---|---|---|---|
| 1 | 张三 | 产品1 | 10 |
| 4 | 李四 | 产品1 | 10 |
将AND修改为WHERE之后,返回的结果就跟我们预期的一致了。
问题总结
在开发过程中,我们难免会因为自己的马虎、不认真而出现问题。然而,作为程序员,我们需要面对问题并努力解决它们。只有这样,我们才能不断提高自己的技能。
问题不是失败,而是学习的机会。我们需要保持积极的态度,并始终寻找改进的空间。通过不断学习和实践,我们才能成为更好的程序员。