首页 > 解决方案 > SQL 在同一个变量上绘制两次

问题描述

我是一个 SQL 新手,我在这方面花了很多时间,但无法破解它。

我的数据库有个人PersonID作为主键。

一表引用Work_Units

Work_Units可以是该人的常用工作单位,也可以是他们的次要工作单位——两者无关。

我想在 SQL 语句中同时显示一个人的常用工作单位和次要工作单位,这意味着搜索相同的变量Work_Unit,但从两个不同的表中引用。

我被告知我需要使用子查询,但我无法让它工作 - 子查询是否需要进入SELECT子句,FROM子句的WHERE子句?

TIA,彼得

标签: sqloracle

解决方案


我想有多种方法可以做到这一点。如果您编辑您的问题并包括所涉及表格的布局,这将有所帮助,但我会试一试:

如果您知道子查询将仅返回一行,则可以将子查询放入 SELECT 子句:

SELECT i.NAME,
       (SELECT w.WORK_UNIT
          FROM WORK_UNITS w
          WHERE w.PERSONID = i.PERSONID AND
                w.WORK_UNIT_TYPE = 'PRIMARY') AS PRIMARY_WORK_UNIT,
       (SELECT w.WORK_UNIT
          FROM WORK_UNITS w
          WHERE w.PERSONID = i.PERSONID AND
                w.WORK_UNIT_TYPE = 'SECONDARY') AS SECONDARY_WORK_UNIT
  FROM INDIVIDUALS i

db<>在这里摆弄

或者如果子查询可以返回多行,您可以将它们加入主查询:

SELECT i.NAME,
       pwu.PRIMARY_WORK_UNIT,
       swu.SECONDARY_WORK_UNIT
  FROM INDIVIDUALS i
  INNER JOIN (SELECT w.PERSONID,
                     w.WORK_UNIT AS PRIMARY_WORK_UNIT
                FROM WORK_UNITS w
                WHERE w.WORK_UNIT_TYPE = 'PRIMARY') pwu
    ON pwu.PERSONID = i.PERSONID
  INNER JOIN (SELECT w.PERSONID,
                     w.WORK_UNIT AS SECONDARY_WORK_UNIT
                FROM WORK_UNITS w
                WHERE w.WORK_UNIT_TYPE = 'SECONDARY') swu
    ON swu.PERSONID = i.PERSONID

db<>在这里摆弄

或者,如果您真的愿意,可以将辅助工作单元放在一个逗号分隔的列表中:

SELECT i.NAME,
       pwu.PRIMARY_WORK_UNIT,
       LISTAGG(swu.SECONDARY_WORK_UNIT, ',')
         WITHIN GROUP (ORDER BY pwu.PRIMARY_WORK_UNIT) AS SECONDARY_WORK_UNITS
  FROM INDIVIDUALS i
  INNER JOIN (SELECT w.PERSONID,
                     w.WORK_UNIT AS PRIMARY_WORK_UNIT
                FROM WORK_UNITS w
                WHERE w.WORK_UNIT_TYPE = 'PRIMARY') pwu
    ON pwu.PERSONID = i.PERSONID
  INNER JOIN (SELECT w.PERSONID,
                     w.WORK_UNIT AS SECONDARY_WORK_UNIT
                FROM WORK_UNITS w
                WHERE w.WORK_UNIT_TYPE = 'SECONDARY') swu
    ON swu.PERSONID = i.PERSONID
  GROUP BY i.NAME, pwu.PRIMARY_WORK_UNIT

db<>在这里摆弄


推荐阅读