【问题标题】:How to change query to nested select?如何将查询更改为嵌套选择?
【发布时间】:2017-04-14 18:50:50
【问题描述】:

我有一个项目,我必须使用嵌套选择和运算符(如 EXISTS、IN、ALL、ANY)来查找拥有更多公寓的业主的姓名。

我有 2 桌业主和公寓

Owner
"ID" NUMBER(5,0), 
"NAME" VARCHAR2(20), 
"PHONE" NUMBER(10,0),
CONSTRAINT "PROPR" PRIMARY KEY ("ID")
USING INDEX  ENABLE; 

Apartment
"ID_AP" NUMBER(5,0), 
"ADDRESS" VARCHAR2(35), 
"SURFACE" NUMBER(10,0),
"ID" NUMBER(5,0),
CONSTRAINT "APART" PRIMARY KEY ("ID_AP")
USING INDEX  ENABLE;

为了找到拥有不止一套公寓的业主,我写了这篇

SELECT name, id, count(id)
from apartment join owner
using (id)
group by id, name
having count(id)>1

但是如何使用嵌套的 Selects 和运算符 EXISTS、IN、ALL、ANY 之一?

【问题讨论】:

  • 这不是mysql
  • 首先为什么需要使用嵌套选择而不是连接?

标签: mysql sql nested-select


【解决方案1】:
WITH myView(name, id,appcount)
as
SELECT name, id, (select count(id) FROM apartment where id = ow.id) 
FROM owner ow

SELECT * from myView
WHERE appcount > 2

使用 WITH 创建内联视图并用于编写查询。 (select count(id) FROM apartment where id = ow.id) 在外部查询的选择中将计算公寓数量。

【讨论】:

    【解决方案2】:

    我不太确定你写的查询是否正确。

    您提供的正确查询是 count(id_ap) 而不是 count(id)

    SELECT o.id, o.name, count(a.id_ap)
    from apartment a
    join owner o on o.id = a.id
    group by o.id, o.name
    having count(a.id_ap)>1
    

    同样的查询使用in子句,但没有公寓的数量,你只知道它是2个或更多

    select o.id, o.name
    from owner o
    where o.id in (select distinct(a.id) from apartment a
    group by a.id having count(a.id_ap) > 1);
    

    您在引用所有者表的公寓表上也缺少外键约束。

    【讨论】:

      【解决方案3】:

      例如这样:

      select * from owner where id IN (
          SELECT id
          from apartment 
          group by id
          having count(id)>1)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-08
        • 2013-01-19
        • 1970-01-01
        • 2022-11-03
        • 2019-09-25
        • 1970-01-01
        • 2012-07-09
        • 2017-05-06
        相关资源
        最近更新 更多