【问题标题】:SQL Oracle - display values only once per columnSQL Oracle - 每列仅显示一次值
【发布时间】:2015-07-03 07:31:25
【问题描述】:

我正在尝试格式化一个 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 没有帮助。有什么建议吗?

【问题讨论】:

  • 为什么你的问题被标记为“SQL Server”,但标题却是“Oracle”?
  • 因为老实说,我真的不知道自己在做什么。
  • 。 .我猜你正在使用Oracle。您使用的软件应该在标签中。
  • 如果您使用的是 SQL*Plus,它可以为您处理此格式要求:docs.oracle.com/cd/B19306_01/server.102/b14357/…
  • 这实际上正是我所需要的。破解,就这么简单。谢谢。

标签: sql oracle select view


【解决方案1】:

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

注意:我将joins 重新排列为LEFT JOINs。大多数人发现它比RIGHT JOINs 更容易关注。

【讨论】:

  • 当另一个强大的使用 over partition by、row num 和 case 语句。但我同意......通常在应用层完成。 +1
  • 这个查询应该有一个 order by,因为行可能不会按预期的顺序显示。
  • @Boneist 。 . .真不知道甲骨文有没有关注order by的观点。通常,在使用视图时,建议是在引用视图的查询中进行排序。例如,order by 明确不允许在 SQL Server 视图中使用,除非该视图还包含 top 并且 ANSI 不需要。
  • 通过创建一个包含 order by 的视图,然后从该视图中进行选择,我可以说 Oracle 非常关注 order by。至少,这就是执行路径中的SORT ORDER BY 步骤告诉我的......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-04
  • 1970-01-01
  • 2011-12-01
相关资源
最近更新 更多