2017-04-26 58 views
0

您好我有一個SQL問題:SQL不同領域結合無視位置

表:飛行

Origin Destination 
-------------------- 
Boston LA 
LA  Bostion 
Newyork LA 
DC  Newyork 

我怎麼會選擇拼路徑的不同組合,如果我不在乎始發地或目的地:(波士頓到洛杉磯)=(洛杉磯到波士頓)

+0

你正在使用哪個dbms? –

+0

sql server,謝謝 – ADJ

回答

2

您可以使用row_number來做到這一點。獲取分區的起源和目的地最少,起源和目的地最大,以便像(a,b),(b,a)這樣的組合得到相同處理。然後獲得每組的第一行。

select origin,destination from (
select origin,destination 
,row_number() over(partition by 
        case when origin<destination then origin else destination end, 
        case when origin>destination then origin else destination end 
        order by origin) as rnum 
from flight 
) t 
where rnum=1 
1

這是做你想做的嗎?

select origin, destination 
from flights f 
where origin < destination 
union all 
select destination, origin 
from flights f 
where origin > destination and 
     not exists (select 1 
        from flights f2 
        where f2.destination = f.origin and f2.origin = f.destination 
       ); 
0

請嘗試以下...

SELECT CASE 
      WHEN Origin < Destination THEN 
       Origin 
      ELSE 
       Destination 
     END AS Terminus1, 
     CASE 
      WHEN Origin < Destination THEN 
       Destination 
      ELSE 
       Origin 
     END AS Terminus2 
FROM Flight 
GROUP BY Terminus1, 
     Terminus2 
ORDER BY Terminus1, 
     Terminus2; 

CASE的用於每個記錄水平進行排序,以便在每個記錄的兩個值‘較小’將首先返回。

GROUP BY將消除水平排序結果中的重複記錄。

ORDER BY在這種情況下不是必需的,但我認爲這可能會使結果更具可讀性。如果你在一組結果可能在其他地方處理而不是由人讀取,你可能希望拋棄這個條款。

如果您有任何問題或意見,請隨時發佈相應評論。