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