Sql 同一表内的联接查询

Sql 同一表内的联接查询,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有表errorflag,其中数据如下 +-----+-----+-------+ | ID | NO | Error | +-----+-----+-------+ | 200 | 100 | 1 | | 201 | 100 | 0 | | 202 | 98 | 1 | | 203 | 98 | 1 | | 204 | 99 | 1 | | 205 | 87 | 1 | | 206 | 87 | 0 | | 207 | 9

我有表
errorflag
,其中数据如下

+-----+-----+-------+
| ID  | NO  | Error |
+-----+-----+-------+
| 200 | 100 |     1 |
| 201 | 100 |     0 |
| 202 |  98 |     1 |
| 203 |  98 |     1 |
| 204 |  99 |     1 |
| 205 |  87 |     1 |
| 206 |  87 |     0 |
| 207 |  90 |     1 |
+-----+-----+-------+
我想有如下数据输出

No

98
99
90
当数字在字段“否”中重复且错误为1和0时,我希望从结果中排除

我正在努力处理连接和计数查询

select  distinct no
from    YourTable yt1
where   not exists
        (
        select  *
        from    YourTable yt2
        where   yt1.no = yt2.no
                and yt2.error = 0
        )

我不是100%清楚被问到什么

如果我认为您只需要
NO
值,而错误不存在
0
,那么这应该可以做到:

SELECT `NO`
  FROM errorflag
  WHERE `NO` NOT IN (
                  SELECT `NO`
                    FROM errorflag 
                    WHERE Error = 0)
  GROUP BY `NO`
输出:

NO
90
98
99

Sqlfiddle是。

可能是。您可以检查错误计数=2和不同错误=2

  select e.* from errorflag e
  left join (
    select  errono, count(*) num_err_no, count(distinct error) count_error 
    from errorflag 
    group by errono 
    having count(*) =2 and count_error = 2
  ) t on t.errorno = e.errorno 
  where t.errorno is null

如果
error
标志始终为
0
1
,则使用
not exists

select ef.*
from errorflag ef
where not exists (select 1 
                  from errorflag ef1 
                  where ef1.no = ef.no and ef1.error <> ef.error
                 );

要排除存在01对的ID,请尝试以下操作

SELECT DISTINCT NO FROM errorflag  
WHERE ID NOT IN 
            (SELECT e1.ID FROM errorflag e1 
                        JOIN errorflag e2 
                            ON (e1.Error = 0 And e2.error = 1 or e2.Error = 0 And e1.error = 1) AND e1.[No] = e2.[no]
            )
是否每个编号最多有2个错误

例如,对于NO 99,你能得到错误0,1,1吗

你看这里有变化吗


如果使用聚合函数,也可以在单个查询中执行此操作。根据您描述的环境,
Error
只能保存0或1的值。因此,您可以按
NO
分组,并确保
Error
的最小值永远不为零

SELECT NO FROM TableName
GROUP BY NO
HAVING MIN(Error) <> 0
从TableName中选择NO
分组编号
最小值(错误)为0

因此,为了澄清,您只想在没有
错误=0
的地方显示
NO
?@Martin,我认为相反-对于
NO
的所有实例,当
错误=1
时只显示
NO
。例如,
NO=100
在所需的输出中被排除。在列中,重复“NO”,并且错误标志为0,我不想从最终结果中排除。在本例中,100有错误1和0,所以我不想将其包含在最终结果中,但98在两行中都有错误1,所以我希望将其包含在最终结果中。不,这种情况永远不会存在。只有0或1在这种情况下,我希望我的代码将排除作为{0,1}对一部分的任何ID,因为它不是你的输入,但它不起作用。勾选[link]这似乎排除了100个有{1,0}的项目,但它包括101个和110个没有{1,0}的项目,这似乎是你们所要求的,祝你们项目好运!我想我会说
=1
,但想法是一样的。@GordonLinoff我最初写的是
=1
,但我想可能是
!=如果错误代码超出0和1的范围,则0
更合适。这是一个很好的方法!写不相等的标准方法是
,我想不是
=
问题被标记为SQL Server,但是背景标记使这个MySQL变得特定。我想这个问题应该为MySQL重新标记?它是针对sql server的。
SELECT NO FROM TableName
GROUP BY NO
HAVING MIN(Error) <> 0