PostgreSQL LEFT JOIN ON AND 查询语句遇到的问题

327 阅读2分钟

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_idcustomer_nameproductquantity
1张三产品110
2产品220
3产品35
4李四产品110
5产品220

问题分析

疑问:

为什么会查询出来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_idcustomer_nameproductquantity
1张三产品110
4李四产品110

将AND修改为WHERE之后,返回的结果就跟我们预期的一致了。

问题总结

在开发过程中,我们难免会因为自己的马虎、不认真而出现问题。然而,作为程序员,我们需要面对问题并努力解决它们。只有这样,我们才能不断提高自己的技能。

问题不是失败,而是学习的机会。我们需要保持积极的态度,并始终寻找改进的空间。通过不断学习和实践,我们才能成为更好的程序员。