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子句很愚蠢。再次感谢!