java - 如何从连接表中为每个主键项仅选择一条记录?

标签 java oracle

我有两个表,分别称为“酒店”和“描述”。描述表包含每家酒店的描述。

  • 在hotels表中,id和city_id共同构成主键(id本身不是主键)
  • 在描述表中,每家酒店最多可以有 8 种描述类型(一般、位置、客房、外观、请注意、包容性、大堂)

我想使用酒店表和描述表更新主表。对于酒店表中的每条记录,我应该在主表中插入一行。当我执行左外连接时,酒店表中的每条记录都会生成多条记录,因为一家酒店有 0 个或多个描述类型。

我只想从描述表中为每家酒店选择一个描述,并且它并不总是第一个描述。 (如果是的话,我可以使用 this one )。相反,我对描述类型有优先顺序。首先我需要检查是否有“一般”描述。如果有,那么这应该是主表的描述,而酒店的其余描述应该被跳过。如果“一般”描述类型不可用,那么我想检查“位置”描述类型是否可用等等。

我尝试为此编写 Oracle SQL 查询,但它并不完全符合我的要求。

enter image description here

以下是我用来连接两个表的查询(每个酒店有多行)。如何在遵守上述准则的同时,为每家酒店筛选出一行?

代码:

    SELECT HOTEL_DETAILS.*,
    Description.Desc_type,
    Description.description
    FROM
     (SELECT Hotel.id,
             Hotel.city_id,
             Hotel.hotel_name,         
             City.country_code
           FROM Hotel
           LEFT OUTER JOIN City
           ON Hotel.city_id=City.city_id
     ) HOTEL_DETAILS
   LEFT OUTER JOIN Description
   ON HOTEL_DETAILS.id    =Description.id
   AND HOTEL_DETAILS.city_id    = Description.city_id

我尝试使用 DECODE 函数,但似乎它不起作用。

最佳答案

    SELECT dtl.id,
           dtl.city_id,
           dtl.hotel_name,
           dtl.country_code,
           min(dsc.desc_type)   KEEP (DENSE_RANK FIRST ORDER BY CASE dsc.desc_type WHEN 'general' THEN 1 WHEN 'location' THEN 2 WHEN 'rooms' THEN 3 WHEN 'lobby' THEN 4 ELSE 5 END) desc_type,
           min(dsc.description) KEEP (DENSE_RANK FIRST ORDER BY CASE dsc.desc_type WHEN 'general' THEN 1 WHEN 'location' THEN 2 WHEN 'rooms' THEN 3 WHEN 'lobby' THEN 4 ELSE 5 END) description
      FROM (SELECT htl.id,
                   htl.city_id,
                   htl.hotel_name,         
                   cty.country_code
              FROM hotel htl
                   LEFT OUTER JOIN city cty
                     ON (htl.city_id = cty.city_id)) dtl
           LEFT OUTER JOIN dsc
             ON (   dtl.id = dsc.id
                AND dtl.city_id = dsc.city_id)
    GROUP BY dtl.id,
             dtl.city_id,
             dtl.hotel_name,
             dtl.country_code,

关于java - 如何从连接表中为每个主键项仅选择一条记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25017712/

相关文章:

Oracle 从主表填充备份表

oracle - System.Data.OracleClient 和 .Net Core 2 : Additional symbol some times?

oracle - Oracle 连接字符串上的 Unicode 参数

oracle - SQL*Plus 用户输入异常处理

java - 尝试在我的java代码中打印数组

java - PKIX 路径构建失败 : unable to find valid certification path to requested target

java - 使用 JavaFX 和 FXML 验证用户输入

SQL:如何将 Oracle 表中的 100,000 条记录分成 5 个 block ?

java - 使用改造后请求正文中的原始字符串

java - 禁用 jconsole 弹出窗口 : "Secure connection failed. Retry insecurely?"