Caster_Z 2024-05-15 00:09 采纳率: 33.3%
浏览 4
已结题

Oracle 多表查询?请教请教。

Oracle 多表查询?请教请教。

已知有三个表:
2020表
| 姓名 | 身1高 | 体2重 | 日3期 |
| 张三 | 170 | 70 | 0101 |
| 张三 | 170 | 70 | 0102 |
| 李四 | 170 | 70 | 0101 |

2021表
| 姓名 | 身1高 | 体2重 |日3期 |
| 张三 | 170 | 70 | 0101 |
| 李四 | 170 | 70 | 0101 |
| 李四 | 170 | 70 | 0102 |
| 李四 | 170 | 70 | 0103 |

2022表
| 姓名 | 身1高 | 体2重 |日3期 |
| 张三 | 170 | 70 | 0101 |
| 张三 | 170 | 70 | 0102 |
| 张三 | 170 | 70 | 0103 |
| 李四 | 170 | 70 | 0101 |

要实现查询结果

img

这种查询方法叫什么?波峰查询?不会写这样的SQL,主要是不同年份都从对应纵列向下排序,唯一对照就是名字,而且部分内容为空。
Oracle 直接用SQL就不会写了,请教。

  • 写回答

3条回答 默认 最新

  • 阿里嘎多学长 2024-05-15 00:09
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    【您想要解决的问题】:您想要解决的问题是在Oracle数据库中执行多表查询,以实现将三个不同年份的表(2020表、2021表、2022表)中的数据,按照姓名进行匹配,并将相同姓名在不同年份表中的身高、体重和日期信息横向排列在一个查询结果集中。

    【问题出现原因】:这个问题出现的原因是您需要一个能够处理多表数据并进行横向拼接的查询方法,但是您可能不熟悉如何使用SQL语句来实现这种复杂的数据展示。

    【问题解决方案】:要解决这个问题,可以使用Oracle SQL中的PIVOT操作来实现数据的横向旋转。PIVOT操作可以将行数据转换为列数据,非常适合您所描述的查询需求。

    【提供代码】:下面是一个使用PIVOT操作的SQL查询示例,它将实现您所需的查询结果:

    SELECT *
    FROM (
      SELECT "姓名", "身1高" AS "身高", "体2重" AS "体重", "日3期" AS "日期", '2020' AS "年份"
      FROM 2020表
      UNION ALL
      SELECT "姓名", "身1高", "体2重", "日3期", '2021'
      FROM 2021表
      UNION ALL
      SELECT "姓名", "身1高", "体2重", "日3期", '2022'
      FROM 2022表
    ) t
    PIVOT (
      MAX("身高")
      FOR "年份" IN ('2020' AS "2020身高", '2021' AS "2021身高", '2022' AS "2022身高")
    ) p
    JOIN (
      SELECT "姓名", "体重", "日期", '2020' AS "年份"
      FROM 2020表
      UNION ALL
      SELECT "姓名", "体2重", "日3期", '2021'
      FROM 2021表
      UNION ALL
      SELECT "姓名", "体2重", "日3期", '2022'
      FROM 2022表
    ) t2
    PIVOT (
      MAX("体重")
      FOR "年份" IN ('2020' AS "2020体重", '2021' AS "2021体重", '2022' AS "2022体重")
    ) p2
    ON p."姓名" = p2."姓名"
    JOIN (
      SELECT "姓名", "日期", '2020' AS "年份"
      FROM 2020表
      UNION ALL
      SELECT "姓名", "日3期", '2021'
      FROM 2021表
      UNION ALL
      SELECT "姓名", "日3期", '2022'
      FROM 2022表
    ) t3
    PIVOT (
      MAX("日期")
      FOR "年份" IN ('2020' AS "2020日期", '2021' AS "2021日期", '2022' AS "2022日期")
    ) p3
    ON p."姓名" = p3."姓名"
    ORDER BY p."姓名";
    

    请注意,您需要根据实际的表名和列名调整上述SQL语句。

    【代码运行方式】:您需要在Oracle数据库环境中运行这个SQL查询。您可以使用SQL*Plus、SQL Developer或其他支持Oracle SQL的数据库管理工具。

    【代码预期运行结果】:这个查询将返回一个表格,其中包含姓名、2020年的身高、体重和日期,2021年的身高、体重和日期,以及2022年的身高、体重和日期,所有数据都按照姓名横向排列。

    【推荐相关链接】:

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 5月28日
  • 修改了问题 5月15日
  • 创建了问题 5月15日