我无法弄清楚如何为此形成一个合适的SQL语句。我希望从products表中获取每一行,但如果其他表中的某些值大于某些值,则过滤结果。
我当前的语句返回我想要正确过滤的每一行,但我无法使其过滤掉当前结果并打印其他所有内容
SELECT p.*
FROM products p
LEFT JOIN orders o ON o.product_id = p.product_id AND order_date < somedate
WHERE o.id IS NULL
如果订单表列order_date小于给定日期,我希望它打印除过滤行之外的整个产品表,
编辑:感谢所有帮助过我的人!
答案 0 :(得分:4)
SELECT p.*
FROM products p
LEFT JOIN orders o ON o.product_id = p.product_id AND order_date < somedate and o.id IS NULL
答案 1 :(得分:3)
SELECT p.*
FROM products p
LEFT JOIN orders o ON o.product_id = p.product_id
WHERE o.id IS NULL AND order_date < somedate
只需将条件移至WHERE
部分
答案 2 :(得分:3)
每当您需要过滤结果集时,请在WHERE
子句中提及条件。
每当您需要过滤要加入的表时,请在JOIN
条件中提及条件。如果它是一个INNER JOIN
,它会有效。但是在LEFT OUTER and RIGHT OUTER JOIN
的情况下情况有很大不同。
所以查询变为: -
SELECT p.*
FROM products p
LEFT JOIN orders o ON o.product_id = p.product_id
WHERE o.id IS NULL
AND order_date < somedate
答案 3 :(得分:2)
SELECT *
FROM products
WHERE NOT EXISTS
(
SELECT *
FROM orders
WHERE product_id = products.product_id
AND order_date < somedate
);
(你可以用外连接来解决这个问题,在我的眼中看起来有点古怪。请注意:当外连接时,不要在where子句中使用外连接表字段,因为它们将为null当然是外部联合记录。)
答案 4 :(得分:1)
尝试:
SELECT p.*
FROM products p
LEFT JOIN orders o ON o.product_id = p.product_id
WHERE o.id IS NULL AND order_date < somedate
答案 5 :(得分:1)
打印“其他所有内容”并不仅仅是对此查询的否定。重点是products
表,大概你不想重复。您可以使用except
来实现此目的。这是另一种方法:
SELECT p.*
FROM products p
WHERE NOT EXISTS (select 1
from orders o
where o.product_id = p.product_id AND
o.order_date >= somedate
);
这将返回在给定日期之后或之后没有订单的产品。
请注意,这将返回没有订单的产品。我不清楚如何处理这些问题。