Oracle安排

时间:2014-02-08 17:08:53

标签: sql oracle

所以我有这个问题,我有这个表位置{id,name}。在查询中,如何逐个获得不同排列的数量?

例如,我有三个位置:

  • 葡萄牙
  • 西班牙
  • UK

组合是

  • 葡萄牙,西班牙
  • 西班牙葡萄牙
  • 葡萄牙,UK
  • 英国,葡萄牙
  • 西班牙,UK
  • 英国,西班牙

所以返回的值应该是6.我无法理解这个问题。

3 个答案:

答案 0 :(得分:3)

这样做:

SELECT COUNT(1) FROM (SELECT t1.name as name1, t2.name as name2 
FROM Locations t1, Locations t2
WHERE t1.name <> t2.name)

以下是http://sqlfiddle.com/#!4/41a10/3

的示例

答案 1 :(得分:1)

正如其他人所说的那样,如果你只是想要这个数字,这很容易做,因为它只是一个数学问题。

如果您真的想要所有组合,那么您正在寻找笛卡尔积,除非您想要过滤掉相同的对。

见下文 -

with tbl as(
select '01' as id, 'Portugal' as name from dual union all
select '02' as id, 'Spain' as name from dual union all
select '03' as id, 'UK' as name from dual
)
select x.name, y.name
from tbl x, tbl y
where x.name <> y.name

结果:

NAME        NAME
Portugal    Spain
Portugal    UK
Spain       Portugal
Spain       UK
UK          Portugal
UK          Spain

答案 2 :(得分:0)

最简单的方法就是应用正确的公式:

select count(*) * (count(*) - 1)
from locations l;

如果您可能有重复项,请使用count(distinct)

select count(distinct name) * (count(distinct name) - 1)
from locations l;

n件事的双向组合数为n*(n - 1)。如果不管订单如何,那么你可以将上面除以2