【问题标题】:PSQL Is this a legal way to use subqueries?PSQL 这是使用子查询的合法方式吗?
【发布时间】:2019-01-12 13:09:37
【问题描述】:

我正在为我的数据库管理系统考试而学习,但我不确定这是否合法。

在一个俱乐部的数据库中,我被要求返回姓名、电子邮件和金额(每年支付)。

  • 如果一个人是“单身人士”,则金额为 20.--,
  • 如果是组织,金额为150。--

数据库如下所示:

Table Membership
(
    id serial PRIMARY KEY,
    email text NOT NULL,
    ... --unnecessary
)

Table Organisation
(
    id int REFERENCES Membership(id) PRIMARY KEY,
    "name" varchar Not NULL
    ... -- unnecessary
)

Table SinglePerson
(
    id int REFERENCES Membership(id) PRIMARY KEY,
    "name" varchar NOT NULL
)

查询如下所示:

SELECT 
    Name, Email, Amount
FROM
    (SELECT 
         E.Name, M.Email, 20 AS Amount
     FROM 
         SinglePerson AS E
     JOIN 
         Membership As M ON M.Id = E.Id),
    (SELECT 
         O.Name, M.Email, 150 AS Amount
     FROM 
         Organisation AS O
     JOIN 
         Membership AS M ON M.Id = O.Id);

这个查询可能吗?

有没有更好的方法来做到这一点?

非常感谢!

【问题讨论】:

    标签: sql postgresql join select subquery


    【解决方案1】:

    没有关于子查询的规则——只是语法错误。但是应该有一条法律禁止在FROM 子句中使用逗号。学习使用正确、明确、标准 JOIN 语法。

    虽然我会以不同的方式编写查询,但您的目标似乎是UNION ALL 类型的查询:

    SELECT sp.Name, M.Email, 20 AS Amount
    FROM SinglePerson sp JOIN
         Membership M
         ON M.Id = sp.Id
    UNION ALL
    SELECT O.Name, M.Email, 150 AS Amount
    FROM Organisation O JOIN
         Membership M
         ON M.Id = O.Id;
    

    【讨论】:

      【解决方案2】:

      我愿意:

      select
        m.name,
        m.email,
        case when s.id is not null then 20
             when o.id is not null then 150
             else null
        end as amount
      from membership m
      left join singleperson s on s.id = m.id
      left join organisation o on o.id = m.id
      

      【讨论】:

        猜你喜欢
        • 2021-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多