2012-08-31 117 views
1

我有两个表“客户”和“激活”,我想加入。这里是他们的结构:根据条件SQL查询连接

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数据库btw

有人可以帮助我吗?感谢

+0

对于每种类型和EntityId组合,“Activation”中是否只有一行? –

+0

@lc。是的,EntityId是在客户表中引用Id的外键。对不起,我应该提到 – CuriousCoder

+1

@hari,你确定这是一个很好的设计吗?我个人不鼓励做这样的事情。 – nothrow

回答

3
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都为空的实体。我不知道甲骨文的语法,你可以用的东西删除ID = 3样WHERE NOT (IsNull(Date_Email) && IsNull(Date_SMS))

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'