SQL查找不具有重复列值的行
我有一个问题SQL查找不具有重复列值的行,sql,oracle,oracle10g,Sql,Oracle,Oracle10g,我有一个问题 select * from circuit where y ='b'; 我得到以下结果 x | location_a | location_b | y ----------------------------------------- 1232 | mexico | usa | b 1232 | mexico | usa | b 1232 | brasil | usa
select * from circuit where y ='b';
我得到以下结果
x | location_a | location_b | y
-----------------------------------------
1232 | mexico | usa | b
1232 | mexico | usa | b
1232 | brasil | usa | b
9999 | brasil | usa | b
我需要找出没有重复位置a和位置b的x
。在这种情况下,必须打印以下数据
1232 | brasil | usa | b
9999 | brasil | usa | b
我正在使用Oracle 10g。如果可能的话,请告诉我。(distinct/group by将删除重复项,但仍保留我不需要的那一行)您可以使用分析函数对匹配项进行计数,然后进行筛选:
select x, location_a, location_b, y
from (select c.*,
count(*) over (partition by x, location_a, location_b) as cnt
from circuit
) c
where cnt = 1;
编辑:
over
子句引入了一个分析函数。要真正理解它们,可以从文档开始(请参阅)。这个特定函数的作用是为结果集中的每一行指定一个值。该值是x
、location\u a
和location\u b
与相关行具有相同值的行数。对于您的数据,它将分配:
x | location_a | location_b | y | cnt
-----------------------------------------------
1232 | mexico | usa | b | 2
1232 | mexico | usa | b | 2
1232 | brasil | usa | b | 1
9999 | brasil | usa | b | 1
前两行有一个“2”,因为有两行是1232/mexico/usa。后两行有一个1,因为它们的三元组是唯一的。您可以使用分析函数对匹配项进行计数,然后进行筛选:
select x, location_a, location_b, y
from (select c.*,
count(*) over (partition by x, location_a, location_b) as cnt
from circuit
) c
where cnt = 1;
编辑:
over
子句引入了一个分析函数。要真正理解它们,可以从文档开始(请参阅)。这个特定函数的作用是为结果集中的每一行指定一个值。该值是x
、location\u a
和location\u b
与相关行具有相同值的行数。对于您的数据,它将分配:
x | location_a | location_b | y | cnt
-----------------------------------------------
1232 | mexico | usa | b | 2
1232 | mexico | usa | b | 2
1232 | brasil | usa | b | 1
9999 | brasil | usa | b | 1
前两行有一个“2”,因为有两行是1232/mexico/usa。后两行有一个1,因为它们的三元组是唯一的。您可以使用分析函数对匹配项进行计数,然后进行筛选:
select x, location_a, location_b, y
from (select c.*,
count(*) over (partition by x, location_a, location_b) as cnt
from circuit
) c
where cnt = 1;
编辑:
over
子句引入了一个分析函数。要真正理解它们,可以从文档开始(请参阅)。这个特定函数的作用是为结果集中的每一行指定一个值。该值是x
、location\u a
和location\u b
与相关行具有相同值的行数。对于您的数据,它将分配:
x | location_a | location_b | y | cnt
-----------------------------------------------
1232 | mexico | usa | b | 2
1232 | mexico | usa | b | 2
1232 | brasil | usa | b | 1
9999 | brasil | usa | b | 1
前两行有一个“2”,因为有两行是1232/mexico/usa。后两行有一个1,因为它们的三元组是唯一的。您可以使用分析函数对匹配项进行计数,然后进行筛选:
select x, location_a, location_b, y
from (select c.*,
count(*) over (partition by x, location_a, location_b) as cnt
from circuit
) c
where cnt = 1;
编辑:
over
子句引入了一个分析函数。要真正理解它们,可以从文档开始(请参阅)。这个特定函数的作用是为结果集中的每一行指定一个值。该值是x
、location\u a
和location\u b
与相关行具有相同值的行数。对于您的数据,它将分配:
x | location_a | location_b | y | cnt
-----------------------------------------------
1232 | mexico | usa | b | 2
1232 | mexico | usa | b | 2
1232 | brasil | usa | b | 1
9999 | brasil | usa | b | 1
前两行有一个“2”,因为有两行是1232/mexico/usa。后两行有一个1,因为它们的三元组是唯一的。您可以使用
group by
删除重复项并添加条件:具有计数(*)=1
:
select x, location_a, location_b
from circuit
where y ='b'
group by x, location_a, location_b
having count(*) = 1
您可以使用
分组依据
,并添加条件删除重复项:计数(*)等于1
:
select x, location_a, location_b
from circuit
where y ='b'
group by x, location_a, location_b
having count(*) = 1
您可以使用
分组依据
,并添加条件删除重复项:计数(*)等于1
:
select x, location_a, location_b
from circuit
where y ='b'
group by x, location_a, location_b
having count(*) = 1
您可以使用
分组依据
,并添加条件删除重复项:计数(*)等于1
:
select x, location_a, location_b
from circuit
where y ='b'
group by x, location_a, location_b
having count(*) = 1
谢谢@Gordon你能解释一下9的计数(*)是多少吗。。。今天我学到了一些新东西。谢谢Gordon。谢谢@Gordon。你能解释一下9的计数(*)是多少吗。。。今天我学到了一些新东西。谢谢Gordon。谢谢@Gordon。你能解释一下9的计数(*)是多少吗。。。今天我学到了一些新东西。谢谢Gordon。谢谢@Gordon。你能解释一下9的计数(*)是多少吗。。。今天我学到了一些新东西。谢谢戈登,我喜欢你的回答。我觉得现在不使用having子句很愚蠢。再次感谢!我喜欢你的回答。我觉得现在不使用having子句很愚蠢。再次感谢!我喜欢你的回答。我觉得现在不使用having子句很愚蠢。再次感谢!我喜欢你的回答。我觉得现在不使用having子句很愚蠢。再次感谢!