繁体   English   中英

从表1中选择TOP列,并将表2与它们的名称连接

[英]Select TOP columns from table1, join table2 with their names

我有一个包含这两列的TABLE1,用于存储航班的出发和到达标识符:

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

以及具有各自ID的TABLE2,其中包含其ICAO代码:

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

获得其中一个很简单,但是无论我尝试什么,混合两个或更多列似乎对我都不起作用。

您可以这样做。

创建并填充表。

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';

在此处输入图片说明

执行查询时,单击工具栏上的此按钮以包括实际的执行计划。

在此处输入图片说明

这是查询的图形执行计划。 每个图标代表将由SQL Server引擎执行的操作。 箭头代表数据流。 流向是从右到左,因此结果是最左边的图标。

在此处输入图片说明

试试这个:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM