【问题标题】:Error: My query (containing subqueries) returns blank错误:我的查询(包含子查询)返回空白
【发布时间】:2017-09-29 10:38:26
【问题描述】:
 SELECT c.id,c.email,cs.Source
 FROM contact c INNER JOIN contactsource__C cs  ON cs.contactid__c = c.id
 WHERE cs.Source IN (SELECT cs.Source FROM contact c
 INNER JOIN contactsource__C cs ON cs.contactid__c = c.id
 WHERE cs.Source = 'DOGS')
 AND cs.Source IN (SELECT cs.Source FROM contact c
 INNER JOIN contactsource__C cs ON cs.contactid__c = c.id
 WHERE cs.Source = 'CATS')

我想要一个包含“DOGS”和“CATS”作为来源的电子邮件列表。

Source 将位于 table:contactsource 中的单独行上,但具有相同的 contact_id(即 table:contact 中的 PK id)

当我运行这个时我没有得到任何结果(单独运行子查询确实会返回结果,并且有些情况下源是 CATS 和 DOGS,在单独的行中注明)

【问题讨论】:

  • 尝试将子查询中的选择列和条件列设置为更低或更高
  • 为什么要使用子查询?你可以简单地说WHERE cs.Source IN ('DOGS', 'CATS'),因为这是所有子查询都可以返回的。
  • 左对齐 SQL 使代码更难阅读和更正。
  • 添加一些示例表数据和预期结果。 (作为格式化文本,而不是图像。)
  • 不要在子查询内外使用相同的别名。至于为什么它不起作用:cs记录只有一个来源,它不能同时匹配'DOGS'和'CATS'。因此,它不应该是您在子查询中寻找的来源,而是联系人 ID。

标签: sql sql-server join subquery ssms


【解决方案1】:

我想要一个包含“DOGS”和“CATS”作为来源的电子邮件列表。

因此,仅从contact 中选择并将条件放在 WHERE 子句中:

select id, email
from contact
where id in
(
  select contactid__c
  from contactsource__C
  where source in ('DOGS', 'CATS')
  group by contactid__c
  having count(distinct source) = 2
);

【讨论】:

  • 如何在没有 JOIN 的情况下从子查询 (contactid_c) 中找到“id”?
  • 如您所见,我汇总了每个联系人 ID(GROUP BY 子句)。所以我得到每个联系人 ID 的一条记录。我只选择狗和猫,在HAVING 子句中我说我只想保留有两个不同来源的联系人 ID,即猫和狗。
【解决方案2】:

将所有代码列设置为 lower 或 upper 可能有效。

 SELECT c.id,c.email,cs.Source
 FROM contact c INNER JOIN contactsource__C cs  ON cs.contactid__c = c.id
 WHERE lower(cs.Source) IN (SELECT lower(cs.Source) FROM contact c
 INNER JOIN contactsource__C cs ON cs.contactid__c = c.id
 WHERE cs.Source = 'DOGS')
 AND lower(cs.Source) IN (SELECT lower(cs.Source) FROM contact c
 INNER JOIN contactsource__C cs ON cs.contactid__c = c.id
 WHERE cs.Source = 'CATS')

【讨论】:

    【解决方案3】:

    首先你有两个相同的子查询,所以最好通过更改子查询中的谓词将它们连接在一起,变为:

    SELECT
       cs.Source
    FROM contact c
    INNER JOIN contactsource__C cs
       ON cs.contactid__c = c.id
    WHERE cs.Source = 'DOGS' or cs.Source = 'CATS';
    

    但我不知道除了结果“CATS”或“DOGS”之外,您期望子查询生成什么,因为您尝试选择放入条件子句中的同一列:

    select 
       u.username 
    from dba_users u 
    inner join dba_profiles p
       on u.profile = p.profile 
    where u.username = 'SYS';
    
    USERNAME
    -----------------------------------------------
    SYS
    SYS
    SYS
    SYS
    SYS
    SYS
    SYS
    SYS
    SYS
    SYS
    SYS
    SYS
    

    因此,您的子查询的结果将是“CATS”或“DOGS”。

    所以你的查询应该是这样的:

    SELECT
       c.id,
       c.email,
       cs.Source
    FROM contact c
    INNER JOIN contactsource__C cs
       ON cs.contactid__c = c.id
    WHERE cs.Source = 'DOGS' OR cs.Source='CATS';
    

    【讨论】:

    • 这不会返回所有“id”实例,其中 Source 是 DOGS 或 CATS,而不是两者?
    • 这里的“OR”表示Source可以是“DOGS”也可以是“CATS”,表示两者,当写“AND”时,表示源的两边"WHERE" 子句应该同时为真,并且您不能在同一时间获得同一列的相同结果。
    • 示例:SQL> 从 dba_users 中选择用户名,其中用户名 = 'SYS' AND username = 'HR';没有选择行 SQL> 从 dba_users 中选择用户名 where username = 'SYS' OR username = 'HR';用户名 -------------------- SYS HR
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-22
    • 2016-06-29
    • 2014-02-15
    • 2012-03-20
    • 1970-01-01
    • 2017-05-29
    • 2012-02-19
    相关资源
    最近更新 更多