SQL Oracle - 每列只显示一次

时间:2015-04-24 15:40:55

标签: sql oracle select view

我正在尝试格式化一个select语句。赋值指定必须以这种方式格式化。

我有一个关于出租车服务的数据库。我必须将公司名称,乘客姓名和出租车号码放在一起。简单。但是,输出指定公司名称应仅在输出中出现一次,位于其自己的组的顶部。所以我有:

CREATE VIEW TAXITRIPS(COMPANYNAME, PASSENGERNAME, TAXI#) AS
(SELECT COMPANY.NAME, BOOKING.NAME, VEHICLES.TAXI#
FROM BOOKING JOIN VEHICLES ON BOOKING.TAXI# = VEHICLES.TAXI#
RIGHT OUTER JOIN COMPANY ON VEHICLES.NAME = COMPANY.NAME);

正确的外部联接是为了仍然显示没有预订记录的公司。如果我现在跑:

SELECT * FROM TAXITRIPS ORDER BY COMPANYNAME ASC;

它会给我一些像

COMPANYNAME          PASSENGERNAME      TAXI#
---------------------------------------------
ABC TAXIS            DAVE                192
LEGION CABS
PREMIER CABS         SHANE               2154
PREMIER CABS         TIM                 2169
SILVER SERVICE       DAVE                18579
SILVER SERVICE       TIM                 18124
SILVER SERVICE       AARON               18917

军团驾驶室没有结果,所有现场显示等等。分配规范说它必须看起来像这样。

COMPANYNAME          PASSENGERNAME      TAXI#
---------------------------------------------
ABC TAXIS            DAVE                192
LEGION CABS
PREMIER CABS         SHANE               2154
                     TIM                 2169
SILVER SERVICE       DAVE                18579
                     TIM                 18124
                     AARON               18917

公司名称只应显示在第一行。 DISTINCT没有帮助。有什么建议吗?

1 个答案:

答案 0 :(得分:6)

通常,您可以在应用程序层执行此操作,因为结果集依赖于行的排序 - 这在SQL中是一件坏事。

但你可以这样做:

SELECT (CASE WHEN ROW_NUMBER() OVER (PARTITION BY c.NAME ORDER BY v.TAXI#) = 1
             THEN c.NAME
        END) as CompanyName, b.NAME, v.TAXI#
FROM COMPANY c LEFT JOIN
     VEHICLES v
     ON v.NAME = c.NAME LEFT JOIN
     BOOKING b 
     ON b.TAXI# = v.FLIGHT#
ORDER BY c.name, v.taxi#;

注意:我将join重新排列为LEFT JOIN s。大多数人发现比RIGHT JOIN更容易理解。