【问题标题】:Displaying two rows that differ by one value but are otherwise identical显示相差一个值但其他方面相同的两行
【发布时间】:2013-10-28 15:59:08
【问题描述】:

我正在上一门数据库课程,但我有一个问题似乎无法正确回答。

有3个表:

country(code, iso_abbreviation, name)
area(name, city, country_code, latitude, longitude, elevation)
attraction(name, type, city, country_name, latitude, longitude, elevation)

现在,问题是这样的:在景点表和区域表中都可以找到区域。列表

(country_abbreviation, area_name, latitude, longitude, elevation)

适用于海拔 5000 英尺以上的所有区域。由于区域和景点数据之间可能存在一些不一致,因此纬度、经度和海拔可能会有所不同。在这种情况下,显示数据的两种变体。

所以我想出了下面的查询,但我不确定它是否正确配对,它也不会将数据分成两行,其中一个 (latitude, longitude, elevation) 元素不同。

SELECT country.iso_abbreviation as country_abbreviation, area.name as name, 
area.latitude, area.longitude, area.elevation
FROM area JOIN country on country.code = area.country_code
      JOIN attraction on area.name = attraction.name
WHERE area.elevation > 10000

UNION 

SELECT DISTINCT country.iso_abbreviation as country_abbreviation, area.name, 
attraction.latitude, attraction.longitude, attraction.elevation
FROM area JOIN country on country.code = area.state_code
      JOIN attraction on area.name = attraction.name
WHERE attraction.elevation > 10000 ORDER BY country_abbreviation
; 

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 请将第二个不相关的问题放到一个单独的问题中。您始终可以链接到此以获取上下文。至于你的主要问题:目前还不清楚。这些表是如何关联的?请声明主键和外键。添加您的 Postgres 版本。修复 5000 和 10000 之间的不匹配

标签: sql postgresql join union common-table-expression


【解决方案1】:

这将按照您的描述进行:

WITH cte AS (
   SELECT c.iso_abbreviation AS country_abbreviation
        , a.name, a.latitude, a.longitude, a.elevation
   FROM   area       a
   JOIN   country    c ON c.code = a.country_code
   WHERE  a.elevation > 5000
   )
SELECT * FROM cte
UNION
SELECT c.country_abbreviation
     , t.name, t.latitude, t.longitude, t.elevation
FROM   cte        c
JOIN   attraction t USING (name)     -- assuming name links area & attraction (?)
ORDER  BY country_abbreviation, name -- (?)

但老实说,桌子的布局以及你被赋予的任务似乎都不清楚。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    • 2021-08-10
    • 1970-01-01
    相关资源
    最近更新 更多