【问题标题】:Find all possible combinations column value in ORACLE SQL在 ORACLE SQL 中查找所有可能的组合列值
【发布时间】:2022-01-22 15:27:47
【问题描述】:

你能帮我解决这个下面的查询吗:

我有下面的数据表。

EmpNo Name City
1 John US
2 Miranda US
3 Pete US
4 Jack US
5 Kathy UK
6 Tanni UK
7 Sally UAE

我想要如下输出:

City Name1 Name2
US John Miranda
US John Pete
US John Jack
US Miranda Pete
US Miranda Jack
US Pete Jack
UK Kathy Tanni

PLSQL 我们可以编写块来获得这个输出。但是单独使用 SQL 代码可以得到输出吗?

【问题讨论】:

  • 您在寻找笛卡尔连接吗? select a.City, a.Name as Name1, b.Name as Name2 from MyTable a, MyTable b
  • 美国、英国、阿联酋是城市吗?
  • @DmitryBychenko 这不是笛卡尔积。基本上我想按位置找出所有可能的组合名称。此外,它不应该有任何重复的条目以及逆序条目。即:John -- Miranda 组合出现在结果中,然后 Miranda -- John 组合不应该出现。
  • @mathguy 是的。位置名称。
  • “城市”比“位置名称”更具体。如果您想要“位置”,那么这将是比“城市”更好的列名(对于美国、英国、阿联酋等值)。

标签: sql oracle plsql


【解决方案1】:
with
  input_table (empno, name, city) as (
    select 1, 'John'   , 'US'  from dual union all
    select 2, 'Miranda', 'US'  from dual union all
    select 3, 'Pete'   , 'US'  from dual union all
    select 4, 'Jack'   , 'US'  from dual union all
    select 5, 'Kathy'  , 'UK'  from dual union all
    select 6, 'Tanni'  , 'UK'  from dual union all
    select 7, 'Sally'  , 'UAE' from dual
  )
-- end of sample data (for testing only, not part of the query)
-- remove WITH clause and use your actual table name below
select t1.city, t1.name as name1, t2.name as name2
from   input_table t1 inner join input_table t2
                      on t1.city = t2.city and t1.empno < t2.empno
order  by t1.empno, t2.empno   -- if needed
;

CITY  NAME1    NAME2  
----- -------- --------
US    John     Miranda
US    John     Pete   
US    John     Jack   
US    Miranda  Pete   
US    Miranda  Jack   
US    Pete     Jack   
UK    Kathy    Tanni 

【讨论】:

    【解决方案2】:

    看起来像自加入。

    SQL> with temp (empno, name, city) as
      2    (select 1, 'John'   , 'US'  from dual union all
      3     select 2, 'Miranda', 'US'  from dual union all
      4     select 3, 'Pete'   , 'US'  from dual union all
      5     select 4, 'Jack'   , 'US'  from dual union all
      6     select 5, 'Kathy'  , 'UK'  from dual union all
      7     select 6, 'Tanni'  , 'UK'  from dual union all
      8     select 7, 'Sally'  , 'UAE' from dual
      9    )
     10  select a.city, a.name, b.name
     11  from temp a join temp b on a.city = b.city and a.name < b.name
     12  order by a.city, a.name;
    
    CIT NAME    NAME
    --- ------- -------
    UK  Kathy   Tanni
    US  Jack    Miranda
    US  Jack    John
    US  Jack    Pete
    US  John    Pete
    US  John    Miranda
    US  Miranda Pete
    
    7 rows selected.
    
    SQL>
    

    【讨论】:

    • 您的输出似乎与请求的不同。区别在于第二个连接条件。
    • 好的,@mathguy,谢谢。应该是 EMPNO 而不是 NAME。尽管如此,这些仍然是组合,并且(如何编写这样的查询)的总体思路仍然有效。
    • 不客气。
    猜你喜欢
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-09
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多