2014-02-08 56 views
0

所以我有這個問題,我有這個表位置{id,name}。在查詢中,我怎樣才能得到兩個不同排列的數量?Oracle安排

比如我有三個位置:

  • 葡萄牙
  • 西班牙
  • 英國

組合是

  • 葡萄牙,西班牙
  • 西班牙葡萄牙
  • 葡萄牙,英國
  • 英國,葡萄牙
  • 西班牙,英國
  • 英國,西班牙

,返回的值應爲6。我不能讓我的頭圍繞此問題。

+2

聽起來像是簡單的數學,我 - 只是3×2 - 3項有2個自由度。您可以計算多種組合的數量 - 對於4個項目,它應該是4個項目,3個自由度(4 x 3) – Charleh

+0

您確實需要這個數字嗎?這只是一些排列數學運算 - 或者你希望每一對都作爲結果集返回嗎? – Randy

回答

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

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除以上。

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