SQL NOT IN结果不是预期的结果

时间:2017-05-18 13:24:29

标签: mysql sql

我有以下查询:

  SELECT om.member_id
    FROM org_member om
   WHERE om.org_id = 1
     AND om.member_id NOT IN (
         SELECT member_id 
           FROM org_group_member 
          WHERE member_id = om.member_id AND is_pending = 'N') 
ORDER BY om.member_id

NOT IN中的子查询在完整查询之外自行运行时,不返回特定成员标识的行。但是,在运行完整查询时,子查询不会导致从结果集中排除成员标识,即使子查询在单独运行时没有返回任何行。

例如,如果在子查询中使用om.member_id为1作为独立查询,则不返回任何行。但是,如果运行完整查询,则返回成员标识1。

我显然遗漏了关于NOT IN子句的内容。

表org_member有:    org_id    member_id

表org_group_member有:    org_id    grp_id    会员ID    is_pending(Y或N)

我需要org_group_member表中不存在的所有成员的结果集,或者仅在org_group_table中使用is_pending = Y(因为成员可以在多个组中,所以成员可以有多行)

e.g org_group_member
org_id  mbr_id  grp_id  is_pending
1       1       1       Y
1       1       2       Y
1       2       1       N
1       2       2       Y

我的结果集应该包含成员1和3但不包含2。 应该包括3,因为它不存在于org_group_member表

6 个答案:

答案 0 :(得分:1)

从where子句中删除 member_id = om.member_id 。它与 NOT IN 条款形成鲜明对比。

答案 1 :(得分:0)

在您的示例中,您声明子查询不返回member_id为1的行。这意味着当您使用NOT IN时,您基本上要求任何不为空的行数据集,所以你会得到一切。

如果您的子查询返回member_id为1的行,则完整查询将缺少member_id 1的结果。

答案 2 :(得分:0)

SELECT om.member_id
FROM org_member om 
     JOIN org_group_member ogm ON ogm.member_id=om.membeer_id
WHERE om.org_id = 1
  AND ogmis_pending = 'N' 
ORDER BY om.member_id

猜猜你只需要没有待处理的成员ID

关于你的查询,如果子查询返回空,结果为真,例如42 not in {}

更新:根据新要求

SELECT om.member_id 来自org_member om      LEFT JOIN org_group_member ogm ON ogm.member_id = om.membeer_id 在哪里om.org_id = 1   AND(ogm.is_pending ='N'OR ogm.member_id为null) ORDER BY om.member_id

答案 3 :(得分:0)

也许你在ORG_MEMBER中有MEMBER_ID = NULL的记录?在这种情况下,NOT IN将成立。

答案 4 :(得分:0)

您不需要corelated sub query.

以下查询应该有效。

SELECT om.member_id
    FROM org_member om
WHERE om.org_id = 1
    AND om.member_id NOT IN (
        SELECT member_id 
        FROM org_group_member 
        WHERE is_pending = 'N') 
ORDER BY om.member_id

答案 5 :(得分:0)

尝试此查询。

org.mockito.exceptions.misusing.UnfinishedStubbingException: 
Unfinished stubbing detected here:
-> at MyLogicTest.testEnabled

E.g. thenReturn() may be missing.
Examples of correct stubbing:
    when(mock.isOk()).thenReturn(true);
    when(mock.isOk()).thenThrow(exception);
    doThrow(exception).when(mock).someVoidMethod();
Hints:
 1. missing thenReturn()
 2. you are trying to stub a final method, which is not supported
 3: you are stubbing the behaviour of another mock inside before 'thenReturn' instruction if completed