2017-08-17 62 views
0

假设我有一个两个表AB具有相似cust_id柱。我想检索所有的地方都cust_id相等AB,但有不同的电子邮件地址的行。查询两个表用于条件(甲骨文)

我现在拥有的是以下几点:

SELECT 
    A.cust_id, 
    A.email_addr, 
    B.preferred_email 
FROM 
    email_feature A 
    LEFT OUTER JOIN email_feature_sum B ON 
     (
      A.cust_id = B.cust_id 
      AND 
      A.email_addr != B.preferred_email 
     ) 
ORDER BY 
    A.date_loaded DESC 

但它不返回任何结果,我不知道我做错了吗?

+0

你能提供一些来自你希望查询返回的每个表的示例数据吗?这看起来应该做你想做的事情。也许表格中的电子邮件字符串处于不同的本地化状态,或者由于前导空格等原因需要修剪电子邮件字符串? – user681574

+0

@ user681574是的,你是对的。 cust_id在表A中有一个前导零,但表B没有前导零,因此我必须修剪。 – Robben

+0

只是双重检查这里 - 这是否解决您的问题,还是你想一些帮助形成连接,包括修剪? – user681574

回答

1

为了回应上述对OP的评论,我相信A.cust_id需要修正前导零。这可以按如下方式完成:

如果B.cust_id是数字格式,那么也可能必须将其转换为字符串才能使比较生效。我在加入包含这一点,但如果不需要,因为B.cust_id已经是char类型,你可以删除铸造,这将是更有效的。

SELECT 
    A.cust_id, 
    A.email_addr, 
    B.preferred_email 
FROM 
    email_feature A 
    LEFT OUTER JOIN email_feature_sum B ON 
     (
      ltrim(A.cust_id, '0') = to_char(B.cust_id) 
      AND 
      A.email_addr != B.preferred_email 
     ) 
ORDER BY 
    A.date_loaded DESC 
+0

非常感谢!这工作。 – Robben

1

也许结果集的顺序是你扔了。如果你经常做join怎么办?

SELECT ef.cust_id, ef.email_addr, efs.preferred_email 
FROM email_feature ef JOIN 
    email_feature_sum efs ON 
    ON ef.cust_id = efs.cust_id and 
     ef.email_addr <> efs.preferred_email 
ORDER BY ef.date_loaded desc; 
+0

嗯,我用我们的SQL和两个条件都取代了电子邮件地址是平等的,而不是不相等,它仍然没有给我任何结果,但我知道事实上有很多的数据具有相同的电子邮件地址和cust_id,因此我的SQL中一定有问题。 – Robben

+0

在这种情况下,'cust_id'字段不匹配(很有可能) - 即使它们看起来像它们一样。 –

+0

是的你是对的。 cust_id在表A中有一个前导零,但表B没有前导零,因此我必须修剪。将尝试。 – Robben

0

我认为你的数据不符合条件。我一直在测试,它运行成功。

with email_feature as(
select 1 cust_id,'[email protected]' email_addr from dual 
), 
email_feature_sum as(
    select 1 cust_id,'[email protected]' preferred_email from dual 
) 

SELECT 
    A.cust_id, 
    A.email_addr, 
    B.preferred_email 
FROM 
    email_feature A 
    LEFT OUTER JOIN email_feature_sum B ON 
     (
      A.cust_id = B.cust_id 
      AND 
      A.email_addr != B.preferred_email 
     )