2016-05-06 63 views
0

我有一個TABLE1與這兩列加入表2,從​​航班存儲的出發和到達的標識符:從表1中選擇TOP列,他們的名字

dep_id arr_id 

    1 2 
    6 2 
    6 2 
    6 2 
    6 2 
    3 2 
    3 2 
    3 2 
    3 4 
    3 4 
    3 6 
    3 6 

和TABLE2包含了ICAO代碼各個ID:

id icao 
1 LPPT 
2 LPFR 
3 LPMA 
4 LPPR 
5 LLGB 
6 LEPA 
7 LEMD 

如何選擇TABLE1的頂部計數(最常用的出發ID和最常用的到達ID)和組與來自TABLE2相應ICAO代碼,這樣我就可以從所提供的示例性數據得到:

most_arrivals most_departures 
    LPFR    LPMA 

獲得其中一個很簡單,但混合兩列或更多列似乎對我無效,不管我嘗試什麼。

回答

0

試試這個:

select 
    (select name 
     from table2 where id = (
     select top 1 arr_id 
     from table1 
     group by arr_id 
     order by count(*) desc) 
    ) as most_arrivals, 
    (select name 
     from table2 where id = (
     select top 1 dep_id 
     from table1 
     group by dep_id 
     order by count(*) desc) 
    ) as most_departures 
+0

哇,謝謝Lashane。它完美的作品。所以,這基本上是爲每列選擇分組的兩個獨立選擇。很容易,一旦你看到它......再次感謝! –

+0

@NunoPinto是的,只要兩個選擇返回零或一行 - 你可以用這種方式 –

1

你可以不喜歡這樣。

創建並填充表格。

CREATE TABLE dbo.Icao 
(
    id int NOT NULL PRIMARY KEY, 
    icao nchar(4) NOT NULL 
); 

CREATE TABLE dbo.Flight 
(
    dep_id int NOT NULL 
     FOREIGN KEY REFERENCES dbo.Icao(id), 
    arr_id int NOT NULL 
     FOREIGN KEY REFERENCES dbo.Icao(id) 
); 

INSERT INTO dbo.Icao (id, icao) 
    VALUES 
    (1, N'LPPT'), 
    (2, N'LPFR'), 
    (3, N'LPMA'), 
    (4, N'LPPR'), 
    (5, N'LLGB'), 
    (6, N'LEPA'), 
    (7, N'LEMD'); 

INSERT INTO dbo.Flight (dep_id, arr_id) 
    VALUES 
    (1, 2), 
    (6, 2), 
    (6, 2), 
    (6, 2), 
    (6, 2), 
    (3, 2), 
    (3, 2), 
    (3, 2), 
    (3, 4), 
    (3, 4), 
    (3, 6), 
    (3, 6); 

然後做一個使用兩個子查詢的SELECT。

SELECT 
    (SELECT TOP 1 I.icao 
     FROM dbo.Flight AS F 
      INNER JOIN dbo.Icao AS I 
       ON I.id = F.arr_id 
     GROUP BY I.icao 
     ORDER BY COUNT(*) DESC) AS 'most_arrivals', 
    (SELECT TOP 1 I.icao 
     FROM dbo.Flight AS F 
      INNER JOIN dbo.Icao AS I 
       ON I.id = F.dep_id 
     GROUP BY I.icao 
     ORDER BY COUNT(*) DESC) AS 'most_departures'; 

enter image description here

單擊工具欄上的這個按鈕,包括實際的執行計劃,當你執行查詢。

enter image description here

這是用於查詢的圖形化執行計劃。每個圖標代表將由SQL Server引擎執行的操作。箭頭表示數據流。流向從右到左,結果是最左邊的圖標。

enter image description here

+0

我想JOIN比另一個SELECT更快? –

+0

不太可能。 SQL Server查詢優化器確定執行計劃。這是一個非常聰明的軟件,通常選擇執行任何特定查詢的最有效方式。您可以通過單擊工具欄上的按鈕來查看SSMS中的圖形執行計劃。 – RichardCL

+0

實際上,你得到的兩個答案几乎沒有什麼區別。我通過寫我的部分方式,所以我決定無論如何發佈。 – RichardCL