【问题标题】:SQL : Visualizing Some advanced SQL QueriesSQL:可视化一些高级 SQL 查询
【发布时间】:2015-03-19 13:38:32
【问题描述】:

我发现很难理解以下 SQL 查询背后的逻辑。 有人可以解释一个模型来理解这样的查询吗?

1) 查找所有资产大于某个分支的所有分支 在布鲁克林。

select distinct  T.branch_name
from branch as T, branch as S
where  T.assets > S.assets and
             S.branch_city = 'Brooklyn'

2) 查找在位于所有分支机构的所有客户 布鲁克林。

select distinct S.customer_name
from depositor as S
where not exists (
(select branch_name
from branch
where branch_city = 'Brooklyn') 

except
(select R.branch_name
from depositor as T, account as R
where T.account_number = R.account_number and
S.customer_name = T.customer_name ))

【问题讨论】:

标签: sql database oracle database-schema


【解决方案1】:

查询 1 将表中的行与同一表中的单行进行比较。为了更好的可读性,它可以重写为:

select distinct t.branch_name
from branch t
where t.assets > (select nvl(assets,0) from branch
                  where branch_city = 'Brooklyn');

更好地查询“布鲁克林”中的多个分支:

create table branch (
  branch_name varchar2(30),
  branch_city varchar2(30),
  assets number(10));

insert into branch (branch_name,branch_city,assets)
values ('Manhasset 01','Manhasset',12345);
insert into branch (branch_name,branch_city,assets)
values ('Brooklyn Branch 12','Brooklyn',22222);
insert into branch (branch_name,branch_city,assets)
values ('White Plains Downtown','White Plains',33333);
insert into branch (branch_name,branch_city,assets)
values ('Brooklyn DUMBO','Brooklyn',44444);
insert into branch (branch_name,branch_city,assets)
values ('Manhattan - Financial District','Manhattan',55555);
insert into branch (branch_name,branch_city,assets)
values ('Bronx Branch 8','Bronx',66666);
insert into branch (branch_name,branch_city,assets)
values ('Queens - La Guardia','Queens',1234523423);
insert into branch (branch_name,branch_city,assets)
values ('Queens - Flushing Meadows','Queens',12);
insert into branch (branch_name,branch_city,assets)
values ('Rikers Island','Rikers Island',2);
insert into branch (branch_name,branch_city,assets)
values ('Harlem - Branch 1','Harlem',99999);
commit;

select * from branch;
BRANCH_NAME                    BRANCH_CITY                        ASSETS
------------------------------ ------------------------------ ----------
Manhasset 01                   Manhasset                           12345
Brooklyn Branch 12             Brooklyn                            22222
White Plains Downtown          White Plains                        33333
Brooklyn DUMBO                 Brooklyn                            44444
Manhattan - Financial District Manhattan                           55555
Bronx Branch 8                 Bronx                               66666
Queens - La Guardia            Queens                         1234523423
Queens - Flushing Meadows      Queens                                 12
Rikers Island                  Rikers Island                           2
Harlem - Branch 1              Harlem                              99999

/* this should now work for multiple or no Brooklyn branches */
select distinct t.branch_name
from branch t
where t.assets > nvl((select min(nvl(assets,0)) from branch
                      where branch_city = 'Brooklyn'),0);

BRANCH_NAME
------------------------------
Harlem - Branch 1
White Plains Downtown
Queens - La Guardia
Brooklyn DUMBO
Manhattan - Financial District
Bronx Branch 8

delete from branch
where branch_city = 'Brooklyn';
commit;

select distinct t.branch_name
from branch t
where t.assets > nvl((select min(nvl(assets,0)) from branch
                      where branch_city = 'Brooklyn'),0);
BRANCH_NAME
------------------------------
Rikers Island
Harlem - Branch 1
White Plains Downtown
Queens - La Guardia
Manhattan - Financial District
Bronx Branch 8
Manhasset 01
Queens - Flushing Meadows

查询 2 这个怎么样:

select distinct d.customer_name 
from depositor d,account a
where d.account_number = a.account_number
and a.branch_name = 'Brooklyn';

使用显式连接:

select distinct d.customer_name
from depositor d inner join account a
on d.account_number = a.account_number
and a.branch_name = 'Brooklyn';

【讨论】:

  • 你打算讨论他们问题的第二部分吗?
  • 永远不要使用隐式连接——它们是一种 sql 反模式。如果这个人正在学习如何阅读代码,他需要学习如何正确地做到这一点
  • 当布鲁克林分支的资产为空时,您对查询 1 的重写与 OP 查询的含义不匹配,如果布鲁克林分支有多个,则会出错。
  • 哎呀,你说得对@ShannonSeverance!
猜你喜欢
  • 2021-02-11
  • 2015-03-23
  • 2018-01-21
  • 2011-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-18
  • 2015-05-21
相关资源
最近更新 更多