【问题标题】:Why is this SQL return null?为什么这个 SQL 返回 null?
【发布时间】:2018-12-10 08:54:19
【问题描述】:

我不知道为什么这个 SQL 没有返回任何行:

SELECT team_rel.team_id
     , team_rel.login_id 
  FROM team_rel
 INNER JOIN team ON team_rel.login_id = team.login_id
 WHERE team.login_id = '39' 
   AND NOT EXISTS (
         SELECT 0 
           FROM team_rel
          INNER JOIN team ON team_rel.login_id = team.login_id 
                         AND team_rel.login_id = '39' 
                         AND team_rel.team_id  = team.id
       )

以下 SQL(相同但没有 NOT EXISTS 条件):

SELECT team_rel.team_id
     , team_rel.login_id 
  FROM team_rel
 INNER JOIN team ON team_rel.login_id = team.login_id
 WHERE team.login_id = '39'

返回:

+---------+----------+
| team_id | login_id |
+---------+----------+
|      23 |       39 |
+---------+----------+
|      23 |       39 |
+---------+----------+
|      13 |       39 |
+---------+----------+
|      13 |       39 |
+---------+----------+
|      16 |       39 |
+---------+----------+
|      16 |       39 |
+---------+----------+
|      25 |       39 |
+---------+----------+
|      25 |       39 |
+---------+----------+

NOT EXISTS 子查询(与 team_id 测试相同的 SQL)返回:

SELECT team_rel.team_id
     , team_rel.login_id 
  FROM team_rel
 INNER JOIN team ON team_rel.login_id = team.login_id
                AND team_rel.login_id = '39'
                AND team_rel.team_id = team.id

返回:

+---------+----------+
| team_id | login_id |
+---------+----------+
|      23 |       39 |
+---------+----------+
|      25 |       39 |
+---------+----------+

我希望我的第一个选择返回:

+---------+----------+
| team_id | login_id |
+---------+----------+
|      13 |       39 |
+---------+----------+
|      16 |       39 |
+---------+----------+

但它不返回任何行?!

【问题讨论】:

  • 您的子选择中是否缺少 where 子句?
  • 如果您希望我们帮助您,您需要提供更多信息,仅发布一条 SQL 语句不会完成这项工作。
  • 您的子查询不相关...它需要引用外部查询表的条件。
  • “返回 null”是指没有行(不是同一件事)。正如其他人所指出的那样,not exists 子句可能正在删除所有行,但我们需要确定样本数据。
  • 谢谢大家..我添加了更多信息..请检查..

标签: sql join exists


【解决方案1】:
SELECT DISTINCT team_rel.team_id, team_rel.login_id 
FROM team_rel
INNER JOIN team ON team_rel.login_id = team.login_id
WHERE team_rel.login_id = 39
  AND team_rel.team_id NOT IN 
          (SELECT team_id FROM team_rel 
           INNER JOIN team ON team.id = team_rel.team_id AND
                              team.login_id = team_rel.login_id)

【讨论】:

  • 谢谢.. 我做到了,但它返回:team_id 23 13 13 16 16 25 login_id 39 39 39 39 39 39 而我想重新调整:team_id 13 16 login_id 39 39
  • @ShokouhDareshiri 您可能需要将您的输入样本(即两个表格的内容)添加到问题中,以便我们更好地了解您想要实现的目标。
  • @ShokouhDareshiri,我根据我对输入内容所做的一些假设更新了我的答案。
猜你喜欢
  • 1970-01-01
  • 2012-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-09
  • 1970-01-01
  • 1970-01-01
  • 2019-12-26
相关资源
最近更新 更多