Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 排除包含特定值的行_Sql_Oracle - Fatal编程技术网

Sql 排除包含特定值的行

Sql 排除包含特定值的行,sql,oracle,Sql,Oracle,我想排除加入特定群体的人。例如,如果一些学生注册了一个管弦乐队俱乐部,我想检索一份没有注册管弦乐队的学生名单,我该如何做 我不能简单地按条款分组,因为一些学生可能加入了多个俱乐部,并且会绕过Where条件,仍然出现在查询中, 我正在考虑在SELECT子句中使用CASE语句,如果某人加入了Orchestration,则将其标记为“1”,如果没有,则将其标记为“0”,但我正在努力编写聚合CASE函数,这将导致GROUP BY子句出现问题 关于如何用特定行值标记人有什么想法吗 显然,我的表没有保存到

我想排除加入特定群体的人。例如,如果一些学生注册了一个管弦乐队俱乐部,我想检索一份没有注册管弦乐队的学生名单,我该如何做

我不能简单地按条款分组,因为一些学生可能加入了多个俱乐部,并且会绕过Where条件,仍然出现在查询中,

我正在考虑在SELECT子句中使用CASE语句,如果某人加入了Orchestration,则将其标记为“1”,如果没有,则将其标记为“0”,但我正在努力编写聚合CASE函数,这将导致GROUP BY子句出现问题

关于如何用特定行值标记人有什么想法吗

显然,我的表没有保存到SQLFiddle上,因此您可以将下面的代码粘贴到自己的屏幕上:

CREATE TABLE activity ( PersonId, Club) as
  select 1, 'Soccer' from dual union
  select 1, 'Orchestra'  from dual union
  select 2, 'Soccer' from dual union
  select 2, 'Chess' from dual union
  select 2, 'Bball'  from dual union
  select 3, 'Orchestra'  from dual union
  select 3, 'Chess' from dual union
  select 3, 'Bball'  from dual union
  select 4, 'Soccer' from dual union
  select 4, 'Bball' from dual union
  select 4, 'Chess'  from dual;

使用HAVING子句,而不是使用WHERE和case表达式:

HAVING max(case when column = ‘string’ then 1 else 0 end) = 0

在分组后添加此项

从活动表中选择用户ID列表并将其排除在外如何:

select * from 
(
  select a.*,  case when Club ='Orchestra' then 1 else 0 end flag
  from activity a 
) where flag =1; --> get some students signed up for an Orchestra club 

  select * from 
(
  select a.*,  case when Club ='Orchestra' then 1 else 0 end flag
  from activity a 
) where flag =0; --> get students not signed up for an Orchestra club
SELECT * FROM users WHERE id NOT IN 
    (SELECT PersonId FROM activity WHERE Club = 'Orchestra');

可以使用子查询返回要排除的人员列表

-- Returns person 2 and 4.
SELECT 
    PersonId
FROM 
    activity
WHERE 
    PersonId NOT IN 
    (
        -- People to exclude.
        SELECT 
            PersonId 
        FROM 
            activity 
        WHERE 
            Club = 'Orchestra'
    )
GROUP BY 
    PersonId
;

编辑删除子查询中多余的distinct-谢谢@mathguy。

有什么原因不能使用WHERE子句吗?@nbwoodward是的WHERE不起作用,因为一个人可以加入多个俱乐部。它会去掉有“管弦乐队”的行,但不会完全去掉人形。我现在正在测试Sagi的评论。啊,当然。。。您还可以选择一个要退出的用户ID列表(我在下面给出了答案)。是否可能有尚未加入任何俱乐部的“学生”,因此他们首先不会被包括在此表中?你不需要把它们也退了吗?如果您这样做了,那么仅仅对该表进行聚合查询就不可能生成正确的输出。它似乎可以工作!虽然这只显示了有一行带有“string”(与我想要的相反)的人,但我能够使用“AND NOT”进行补偿。谢谢子查询中的DISTINCT肯定是错误的。DISTINCT是一个昂贵的操作,它对未运行的用户没有任何帮助。啊!在测试后,错误地留下。