Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.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 Oracle-为一个字段查找具有不同值的匹配记录_Sql_Database_Oracle - Fatal编程技术网

Sql Oracle-为一个字段查找具有不同值的匹配记录

Sql Oracle-为一个字段查找具有不同值的匹配记录,sql,database,oracle,Sql,Database,Oracle,假设我的Oracle数据库中有下表: Col1: Col2: ... Coln: 1 a ... 1 1 a ... 1 1 b ... 1 1 b ... 1 1 c ... 1 1 a ... 1 2 d ... 1 2 d .

假设我的Oracle数据库中有下表:

Col1:       Col2: ...   Coln:
1           a     ...   1
1           a     ...   1
1           b     ...   1
1           b     ...   1
1           c     ...   1
1           a     ...   1
2           d     ...   1
2           d     ...   1
2           d     ...   1
3           e     ...   1
3           f     ...   1
3           e     ...   1
3           e     ...   1
4           g     ...   1
4           g     ...   1
我想得到的是一个不同的记录列表,其中对于
Col1
Col2
是不同的-忽略所有
Col1
匹配的
Col2
时间

因此,在本例中,我希望得到结果集:

Col1:       Col2:
1           a    
1           b     
1           c    
3           e    
3           f   
现在,我通过使用一个对于手头的问题来说相当复杂的查询来了解如何做到这一点:

With MyData as
(
   SELECT b.Col1, b.Col2, count(b.Col2) over(Partition By b.Col1) as cnt from 
   (
    Select distinct a.Col1, a.Col2 from MyTable a 
   ) b
)

select Col1, Col2
from MyData
where cnt > 1
order by Col1
我想知道的是,做这件事的更好方法是什么-我没有使用
groupby
&
拥有
来做这件事,我可能认为这可以通过使用自连接来完成。。。这更像是一个探索/学习新方法的任务,以获得更好(也许更有效)的查询结果

谢谢

尝试此查询:

SELECT distinct *
FROM table1 t1
WHERE EXISTS
( SELECT 1 FROM table1 t2
  WHERE t1.col2 <> t2.col2
    AND t1.col1 = t2.col1
) 
order by 1,2
很可能会加快所有这些查询的速度。

尝试以下查询:

SELECT distinct *
FROM table1 t1
WHERE EXISTS
( SELECT 1 FROM table1 t2
  WHERE t1.col2 <> t2.col2
    AND t1.col1 = t2.col1
) 
order by 1,2

很可能会加快所有这些查询的速度。

下面是一个使用聚合和分析函数的方法:

with t as (
      select col1, col2,
             count(*) over (partition by col1) as cnt
      from table1
      group by col1, col2
     )
select col1, col2
from t
where cnt > 1;
我想做的是:

  select col1, col2,
         count(*) over (partition by col1) as cnt
  from table1
  group by col1, col2
  having count(*) over (partition by col1) > 1;

但是,这不是有效的SQL,因为在
having
子句中不允许使用分析函数。

这里有一个使用聚合和分析函数的方法:

with t as (
      select col1, col2,
             count(*) over (partition by col1) as cnt
      from table1
      group by col1, col2
     )
select col1, col2
from t
where cnt > 1;
我想做的是:

  select col1, col2,
         count(*) over (partition by col1) as cnt
  from table1
  group by col1, col2
  having count(*) over (partition by col1) > 1;

但是,这不是有效的SQL,因为在
having
子句中不允许使用分析函数。

对此表示感谢,但不幸的是,这不起作用,因为
计数也会对具有相同值的重复记录进行计数,因此它甚至会对
Col2
的非不同值进行计数:(你还有其他想法吗?不幸的是,我会提前告诉你,我会将Kordirko标记为正确答案,因为他是第一个有效的解决方案,但如果你愿意帮助我为学习目的指出正确的方向,我会非常感激!!!!!谢谢你,但这很不幸ly不起作用,因为
计数
也会对具有相同值的重复记录进行计数,因此它甚至会对
Col2
的非不同值进行计数:(你还有其他想法吗?不幸的是,我会提前告诉你,我会将Kordirko标记为正确答案,因为他是第一个有效的解决方案,但是如果你愿意帮助我为学习目的指出正确的方向,我会非常感激!!!!!这很有效!!-谢谢!!!只是为了在我的教育背景下,这会比我编写查询的方式更有效吗?另外,既然这只是我要学习的,你能想出其他方法吗???-我只是想看看有什么方法可以提高我的SQL能力:)我很高兴我能帮上忙。我附加了一些例子,以其他方式做这件事-只是为了学习。你太棒了!!!-这给了我很多东西要学习(这正是我想要的!!!)-非常感谢!!!非常有效!!-谢谢!!!就为了我的教育,这会比我写查询的方式更有效吗?而且,因为这只是为了学习,你能想出其他方法吗???-我只是想看看有什么方法可以提高我的SQL能力:)我很高兴我能提供帮助。我附加了一些例子,以其他方式做这件事-只是为了学习。你太棒了!!!-这给了我很多东西要学习(这正是我想要的!!!)-非常感谢!!!