从我的外部联接结果集中排除一些行

时间:2018-08-04 15:11:24

标签: sql oracle outer-join

我有一个叫产品的表,另一个叫价格。

现在,我试图显示所有带有和不带有价格的产品,所以我正在使用左连接。到目前为止一切顺利。

select * from products,prices where products.id = prices.id(+)

价格表还具有 validFrom validTo 记录。我现在想要实现的是排除过期记录(前两行)。当我使用左联接时,这可能吗?

这是查询的结果。

ResultSet: 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);

我明白了  enter image description here

预期结果应为: enter image description here

3 个答案:

答案 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)

您最好使用内部联接,而不是外部联接;