Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Oracle-每列仅显示一次值_Sql_Oracle_Select_View - Fatal编程技术网

SQL Oracle-每列仅显示一次值

SQL Oracle-每列仅显示一次值,sql,oracle,select,view,Sql,Oracle,Select,View,我正在尝试格式化select语句。分配指定必须以这种方式格式化 我有一个关于出租车服务的数据库。我必须把公司名称、乘客姓名和出租车号码放在一起。容易的但是,输出指定公司名称在输出中仅出现一次,位于其自己的组的顶部。因此,我: CREATE VIEW TAXITRIPS(COMPANYNAME, PASSENGERNAME, TAXI#) AS (SELECT COMPANY.NAME, BOOKING.NAME, VEHICLES.TAXI# FROM BOOKING JOIN VEHICLES

我正在尝试格式化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

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

通常,您会在应用程序层这样做,因为结果集依赖于行的顺序,这在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#;

注意:我将联接重新排列为左联接。大多数人发现这比右连接更容易遵循。

通常,您会在应用程序层执行此操作,因为结果集依赖于行的顺序,这在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#;


注意:我将联接重新排列为左联接。大多数人发现这比正确连接更容易理解。

为什么你的问题被标记为SQL Server,但标题是Oracle?因为我不知道我在做什么,如果我诚实的话。我猜您正在使用Oracle。您使用的软件应该在标签中。如果您使用的是SQL*Plus,它可以为您处理此格式要求:这正是我所需要的。打破,如此简单。谢谢。为什么你的问题被标记为SQL Server,但标题是Oracle?因为我真的不知道我在做什么,如果我诚实的话。我猜您正在使用Oracle。您使用的软件应该在标签中。如果您使用的是SQL*Plus,它可以为您处理此格式要求:这正是我所需要的。打破,如此简单。谢谢。这是over partition by、row num和case语句的另一个强大用法。但我同意。。。通常在应用层完成+1此查询应该有一个order by,因为可能行不会按预期顺序显示。@Boneist。我真的不知道甲骨文是否在某种程度上关注订单。通常,在使用视图时,建议在引用视图的查询中进行排序。例如,SQL Server视图中明确不允许使用order by,除非该视图还包含top且ANSI不要求。通过创建一个包含order by的视图,然后从该视图中进行选择,我可以说Oracle非常重视order by。至少,这是执行路径中按步骤排序的顺序告诉我的…Dang另一个对over partition BY、row num和case语句的强大使用。但我同意。。。通常在应用层完成+1此查询应该有一个order by,因为可能行不会按预期顺序显示。@Boneist。我真的不知道甲骨文是否在某种程度上关注订单。通常,在使用视图时,建议在引用视图的查询中进行排序。例如,SQL Server视图中明确不允许使用order by,除非该视图还包含top且ANSI不要求。通过创建一个包含order by的视图,然后从该视图中进行选择,我可以说Oracle非常重视order by。至少,这是执行路径中按步骤排序的顺序告诉我的。。。