在嵌套的 SQL 语句中使用 OR 运算符
Using the OR operator in a nested SQL Statement
我有一个包含供应商、他们销售什么以及他们所在位置的数据库。
我需要搜索基于特定地区(例如州)的供应商或以寻找销售一定数量产品的供应商。
这个问题的一个例子是:
What are the full names of all vendors who can supply more than one item or are based in Illinois?
如果我可以使用两个 sql 查询(但对于这个问题我不能),这会很容易。
假设在使用的表之间没有连接,我的解决方案是不正确的,但这是我尝试过的
select
cs.vendor_id, name, count(cs.PRODUCT_ID)
from
grocery.vendor
where
va.state_territory_province = 'Illinois'
group by
(cs.vendor_id)
or /# error found here #/
having
(count(cs.product_id)>1);
第 1 行错误:
ORA-00933: SQL 命令未正确结束
如果我分别尝试每一个,我会得到这些结果
使用 Illonois
select
cs.vendor_id, v.name, count(cs.PRODUCT_ID)
from
grocery.vendor v
inner join grocery.vendor_address va
on (v.vendor_id = va.vendor_id)
inner join grocery.can_supply cs
on (v.vendor_id = cs.vendor_id)
where
va.state_territory_province = 'Illinois'
group by
(cs.vendor_id, v.name);
VENDOR_ID 名称计数(CS.PRODUCT_ID)
33 Drinks R Us 1
35 Jungle Man 1
34 Poland Spring 1
使用产品数量
select
cs.vendor_id, v.name, count(cs.PRODUCT_ID)
from grocery.vendor v
inner join grocery.vendor_address va
on (v.vendor_id = va.vendor_id)
inner join grocery.can_supply cs
on (v.vendor_id = cs.vendor_id)
group by (cs.vendor_id, v.name)
having(
count(cs.product_ID)>1);
VENDOR_ID 名称计数(CS.PRODUCT_ID)
8 Orgo Home Farm 3
17 Wellness 2
21 Wily Wonka 4
27 Camel 3
29 Supplies R Us 5
13 Clean Me Please 5
15 Oral Care Inc 2
31 Cheese Cake Factory 2
37 Crunchy 2
1 Moo Moo Milk Farm 4
4 Haagen Daz 3
26 Beer Inc 4
6 Sailor Bob 3
10 Dawn 2
16 SPAM 2
18 Wonder inc 3
5 Butcher Mat 3
9 Soda Forever 4
14 Wash Shampoo Inc 4
24 Huntz 4
20 Hershey 3
22 Bake Me Inc 5
30 We Make Pizza 2
36 Taste Treat 3
7 Monkey Paradise 6
19 Puff 5
已选择 26 行。
基本上我想将这两个查询合并为一个。有没有办法将它们嵌套在一起?
您应该能够将两个条件都放在 HAVING
子句中:
select v.vendor_id,
v.name,
count(cs.PRODUCT_ID)
from grocery.vendor v
join grocery.vendor_address va
on v.vendor_id = va.vendor_id
join grocery.can_supply cs
on v.vendor_id = cs.vendor_id
group by v.vendor_id, v.name, va.state_territory_province
having va.state_territory_province = 'Illinois'
or count(cs.product_ID) > 1
正如评论中指出的那样,我不能只在 HAVING
子句中使用 va.state_territory_province
(愚蠢的我),所以我将其添加到 GROUP BY
子句中。我假设每个供应商只有一个地址。
如何为两个查询使用 UNION 子句?
我倾向于这样做:
select v.*
from gorcery.vendor v join
grocery.vendor_address va
on v.vendor_id = va.vendor_id
where va.state_territory_province = 'Illinois' or
(select count(*)
from grocery.can_supply cs
where v.vendor_id = cs.vendor_id
) > 1;
注意:这并不完美,因为供应商可以有多个地址。所以,我认为更好的解决方案是:
select v.*
from gorcery.vendor v
where exists (select 1
from grocery.vendor_address va
where v.vendor_id = va.vendor_id and
va.state_territory_province = 'Illinois'
) and
(select count(*)
from grocery.can_supply cs
where v.vendor_id = cs.vendor_id
) > 1;
我有一个包含供应商、他们销售什么以及他们所在位置的数据库。
我需要搜索基于特定地区(例如州)的供应商或以寻找销售一定数量产品的供应商。
这个问题的一个例子是:
What are the full names of all vendors who can supply more than one item or are based in Illinois?
如果我可以使用两个 sql 查询(但对于这个问题我不能),这会很容易。
假设在使用的表之间没有连接,我的解决方案是不正确的,但这是我尝试过的
select
cs.vendor_id, name, count(cs.PRODUCT_ID)
from
grocery.vendor
where
va.state_territory_province = 'Illinois'
group by
(cs.vendor_id)
or /# error found here #/
having
(count(cs.product_id)>1);
第 1 行错误: ORA-00933: SQL 命令未正确结束
如果我分别尝试每一个,我会得到这些结果
使用 Illonois
select
cs.vendor_id, v.name, count(cs.PRODUCT_ID)
from
grocery.vendor v
inner join grocery.vendor_address va
on (v.vendor_id = va.vendor_id)
inner join grocery.can_supply cs
on (v.vendor_id = cs.vendor_id)
where
va.state_territory_province = 'Illinois'
group by
(cs.vendor_id, v.name);
VENDOR_ID 名称计数(CS.PRODUCT_ID)
33 Drinks R Us 1
35 Jungle Man 1
34 Poland Spring 1
使用产品数量
select
cs.vendor_id, v.name, count(cs.PRODUCT_ID)
from grocery.vendor v
inner join grocery.vendor_address va
on (v.vendor_id = va.vendor_id)
inner join grocery.can_supply cs
on (v.vendor_id = cs.vendor_id)
group by (cs.vendor_id, v.name)
having(
count(cs.product_ID)>1);
VENDOR_ID 名称计数(CS.PRODUCT_ID)
8 Orgo Home Farm 3
17 Wellness 2
21 Wily Wonka 4
27 Camel 3
29 Supplies R Us 5
13 Clean Me Please 5
15 Oral Care Inc 2
31 Cheese Cake Factory 2
37 Crunchy 2
1 Moo Moo Milk Farm 4
4 Haagen Daz 3
26 Beer Inc 4
6 Sailor Bob 3
10 Dawn 2
16 SPAM 2
18 Wonder inc 3
5 Butcher Mat 3
9 Soda Forever 4
14 Wash Shampoo Inc 4
24 Huntz 4
20 Hershey 3
22 Bake Me Inc 5
30 We Make Pizza 2
36 Taste Treat 3
7 Monkey Paradise 6
19 Puff 5
已选择 26 行。
基本上我想将这两个查询合并为一个。有没有办法将它们嵌套在一起?
您应该能够将两个条件都放在 HAVING
子句中:
select v.vendor_id,
v.name,
count(cs.PRODUCT_ID)
from grocery.vendor v
join grocery.vendor_address va
on v.vendor_id = va.vendor_id
join grocery.can_supply cs
on v.vendor_id = cs.vendor_id
group by v.vendor_id, v.name, va.state_territory_province
having va.state_territory_province = 'Illinois'
or count(cs.product_ID) > 1
正如评论中指出的那样,我不能只在 HAVING
子句中使用 va.state_territory_province
(愚蠢的我),所以我将其添加到 GROUP BY
子句中。我假设每个供应商只有一个地址。
如何为两个查询使用 UNION 子句?
我倾向于这样做:
select v.*
from gorcery.vendor v join
grocery.vendor_address va
on v.vendor_id = va.vendor_id
where va.state_territory_province = 'Illinois' or
(select count(*)
from grocery.can_supply cs
where v.vendor_id = cs.vendor_id
) > 1;
注意:这并不完美,因为供应商可以有多个地址。所以,我认为更好的解决方案是:
select v.*
from gorcery.vendor v
where exists (select 1
from grocery.vendor_address va
where v.vendor_id = va.vendor_id and
va.state_territory_province = 'Illinois'
) and
(select count(*)
from grocery.can_supply cs
where v.vendor_id = cs.vendor_id
) > 1;