SQL Oracle-每列仅显示一次值
我正在尝试格式化select语句。分配指定必须以这种方式格式化 我有一个关于出租车服务的数据库。我必须把公司名称、乘客姓名和出租车号码放在一起。容易的但是,输出指定公司名称在输出中仅出现一次,位于其自己的组的顶部。因此,我: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
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。至少,这是执行路径中按步骤排序的顺序告诉我的。。。