【问题标题】:SQL query join based on condition基于条件的 SQL 查询连接
【发布时间】:2012-08-31 09:10:49
【问题描述】:

我想加入两个表“客户”和“激活”。以下是它们的结构:

 CUSTOMER                       Activation
 ------------                  ------------- 
 Id      Name                   EntityId       Date_Created       Type
 1       A                         1               2012            EMAIL
 2       B                         2               2011            SMS
 3       C

现在,我想在 customer.Id = Activation.EntityId 上加入这两个表。但是,我希望我的最终表结构是这样的:

 Id    Name    Date_Email       Date_SMS       

 1      A        2012             NULL
 2      B        NULL             2011

基本上,Date_Email 和 Date_SMS 列都来自 Activation.Date_Created 列。如果 Activation.Type 是 EMAIL,我将最终结果中的 Date_Email 设置为 Date_created 并将 Date_SMS 设置为 null。如果 Activation.type 是 SMS,我会采用另一种方式。

我现在拥有的是这样的:

SELECT Customer.Id, Name, Date_Created AS Date_EMail, DATE_Created AS Date_SMS 
from Customer 
inner join Activation ON Customer.Id = Activation.EntityId;

现在,我需要根据 Activation.Type 列创建一个 If-else 条件。我对此很陌生,我无法通过谷歌搜索来解决这个问题。顺便说一句,我正在使用 Oracle XE 数据库

有人可以帮我解决这个问题吗?谢谢

【问题讨论】:

  • Activation 中每种类型和 EntityId 组合是否只有一行?
  • @lc。是的,EntityId 是一个外键,引用客户表中的 Id。对不起,我应该提到这一点
  • @hari,你确定这是一个好的设计吗?我个人不鼓励这样做。
  • @Yossarian 你能告诉我为什么吗?

标签: sql oracle


【解决方案1】:
SELECT Id, Name, A1.Date_Created as Date_Email, A2.Date_Created as Date_SMS FROM
CUSTOMER C
LEFT JOIN Activation A1 ON C.Id=A1.EntityID AND A1.Type='EMAIL'
LEFT JOIN Activation A2 ON C.Id=A2.EntityID AND A1.Type='SMS'

这还会添加 ID=3 的实体,其中 Date_EmailDate_SMS 为空。我不知道Oracle的语法,你可以用WHERE NOT (IsNull(Date_Email) && IsNull(Date_SMS))之类的东西去掉ID=3

【讨论】:

    【解决方案2】:

    您需要加入两次,每种类型一次(并使用 LEFT JOIN 来允许空值):

    SELECT Customer.Id, Name, ActEmail.Date_Created AS Date_EMail, ActSMS.DATE_Created AS Date_SMS 
    FROM Customer 
    LEFT OUTER JOIN Activation AS ActEmail ON Customer.Id = ActEmail.EntityId AND ActEmail.Type = 'EMAIL'
    LEFT OUTER JOIN Activation AS ActSMS ON Customer.Id = ActSMS.EntityId AND ActSMS.Type = 'SMS'
    

    【讨论】:

      猜你喜欢
      • 2018-10-29
      • 1970-01-01
      • 1970-01-01
      • 2018-03-08
      • 2020-03-25
      • 2011-10-07
      • 2021-08-23
      • 1970-01-01
      • 2022-10-15
      相关资源
      最近更新 更多