繁体   English   中英

在嵌套的 SQL 语句中使用 OR 运算符

[英]Using the OR operator in a nested SQL Statement

我有一个包含供应商的数据库,他们销售什么以及他们位于何处。

我需要搜索基于特定地点(如州)的供应商销售一定数量产品的供应商。

这个问题的一个例子是:

可以提供不止一件商品或位于伊利诺伊州的所有供应商的全名是什么?

如果我可以使用两个 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 命令未正确结束

如果我分别尝试每一个,我会得到这些结果

使用伊洛诺伊州

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 NAME COUNT(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 NAME COUNT(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 行。

基本上我想将这两个查询合并为一个。 有没有办法将这些嵌套在一起?

我倾向于这样做:

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;

您应该能够将两个条件都放在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 子句怎么样?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM