我有一个叫产品的表,另一个叫价格。
现在,我试图显示所有带有和不带有价格的产品,所以我正在使用左连接。到目前为止一切顺利。
select * from products,prices where products.id = prices.id(+)
价格表还具有 validFrom 和 validTo 记录。我现在想要实现的是排除过期记录(前两行)。当我使用左联接时,这可能吗?
这是查询的结果。
ResultSet:
使用
SELECT *
FROM products
LEFT JOIN prices
ON products.id = prices.id
AND (prices.validfrom >= sysdate
OR prices.validfrom IS NULL)
AND (prices.validto < sysdate
OR prices.validto IS NULL);
我明白了
预期结果应为:
答案 0 :(得分:1)
在prices.validfrom <= sysdate AND prices.validto > sysdate
子句中添加一个ON
的支票。
SELECT *
FROM products
LEFT JOIN prices
ON products.id = prices.id
AND (prices.validfrom <= sysdate
OR prices.validfrom IS NULL)
AND (prices.validto > sysdate
OR prices.validto IS NULL);
您还应该使用显式LEFT JOIN
语法,而不要使用古老的WHERE ... (+)
。
答案 1 :(得分:0)
尝试一下:
SELECT * FROM (select * from products,prices where products.id = prices.id(+)) WHERE (prices.validTo IS NULL OR prices.validTo > sysdate)
答案 2 :(得分:0)
您最好使用内部联接,而不是外部联接;