gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 05:35:25 25 4
gpt4 key购买 nike

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

  • 在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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com