【问题标题】:Oracle left join with conditions from the target tableOracle left join 与目标表中的条件
【发布时间】:2021-09-20 21:03:21
【问题描述】:

我有两张表 CustomersSales,如下所示:

客户

id first_name last_name gender age customer_since
1 Daniel Black M 34 2014-10-13
2 Erik Brown M 25 2015-06-10
3 Diana Trump F 39 2015-10-25
4 Anna Yao F 19 2017-02-20
5 Christian Sanders M 42 2018-01-31

销售

id date book_id customer_id quantity amount
1 2019-09-02 2 3 1 14.99
2 2019-10-01 1 2 1 12.99
3 2019-10-01 3 4 1 15.75

我需要在销售表中获取所有客户及其数据,即使他们在销售表中没有记录,所以我确实像下面这样离开了:

SELECT c.id as customer_id, c.first_name, c.last_name, c.gender, c.age, c.customer_since,    
       s.sdate AS sales_date, s.id as sale_id
FROM customers c
LEFT JOIN sales s
ON c.id = s.customer_id

我得到了这个结果:

CUSTOMER_ID FIRST_NAME LAST_NAME GENDER AGE CUSTOMER_SINCE SALES_DATE SALE_ID
3 Diana Trump F 39 25-OCT-15 02-SEP-19 1
2 Erik Brown M 25 10-JUN-15 01-OCT-19 2
1 Daniel Black M 34 13-OCT-14 - -
4 Anna Yao F 19 20-FEB-17 - -
5 Christian Sanders M 42 31-JAN-18 - -

这是预期我的问题是,如果我需要获取仅在源表中的所有客户和来自目标表中的具有特定条件的客户,我会运行以下查询

SELECT c.id as customer_id, c.first_name, c.last_name, c.gender, c.age, c.customer_since,    
       s.sdate AS sales_date, s.id as sale_id
FROM customers c
LEFT JOIN sales s
ON c.id = s.customer_id
where s.id=1

我只有一个这样的记录

CUSTOMER_ID FIRST_NAME LAST_NAME GENDER AGE CUSTOMER_SINCE SALES_DATE SALE_ID
3 Diana Trump F 39 25-OCT-15 02-SEP-19 1

但我需要这个结果

CUSTOMER_ID FIRST_NAME LAST_NAME GENDER AGE CUSTOMER_SINCE SALES_DATE SALE_ID
3 Diana Trump F 39 25-OCT-15 02-SEP-19 1
1 Daniel Black M 34 13-OCT-14 - -
4 Anna Yao F 19 20-FEB-17 - -
5 Christian Sanders M 42 31-JAN-18 - -

我该怎么办?

【问题讨论】:

    标签: sql oracle join


    【解决方案1】:

    您需要将条件从第二个查询的WHERE 子句移动到连接的ON 子句:

    SELECT c.id as customer_id, c.first_name, c.last_name, c.gender, c.age,
           c.customer_since, s.sdate AS sales_date, s.id AS sale_id
    FROM customers c
    LEFT JOIN sales s
        ON c.id = s.customer_id AND s.id = 1;
    

    通过在 WHERE 子句中限制销售 ID,您可以过滤掉任何不匹配的记录。通过将此限制移至联接,所有记录都将保留,但NULL 值将出现在所有不匹配的销售字段中。

    【讨论】:

    • 我只有一个问题要问你,我们可以使用 (+) 快捷方式吗?或者我们必须使用全左连接关键字来实现这一点?
    • 我上面使用的语法是 ANSI-92 兼容的,是编写查询的首选方式。忘记使用+ 进行外连接;现代系统中几乎没有使用这种语法。
    猜你喜欢
    • 2014-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-24
    • 2012-08-22
    • 2010-09-29
    相关资源
    最近更新 更多