oracle sql 语句帮助查询多个表

oracle sql statement help to query against multiple tables

我正在努力处理 sql 语句。我希望大师可以帮助初学者,目前我有多个 select in statements.. 但认为有更好的方法,因为我一直被卡住。

下面是 table 和每个 table

中的相关列
country
 -country_id
barcodes_banned_in_country
 -barcode(varchar)
 -country_id
 -country_name
orders
 -order_id
 -country_name
item
  -order_id
  -item_id
  -barcode(varchar)

目标是根据条形码禁止列表获取所有被禁止的订单。 对此 sql 声明的任何帮助将不胜感激。

一个选项使用 exists:

select o.*
from orders o
where exists (
    select 1
    from barcodes_banned_in_country bic
    inner join item i on i.barcode = bic.barcode
    where i.order_id = o.order_id and bic.country_name = o.country_name
)

这会带来所有订单,其中至少一件商品的条形码在订单所在国家/地区被禁止。

另一方面,如果您想要每个订单的禁用条形码列表,那么您可以加入并聚合:

select o.order_id, o.country_name, listagg(i.barcode, ',') banned_barcodes
from orders o
inner join item i 
    on  i.order_id = o.order_id
inner join barcodes_banned_in_country bic 
    on  i.barcode = bic.barcode 
    and bic.country_name = o.country_name
group by o.order_id, o.country_name

请注意,正如 MT0 评论的那样,您实际上应该在 orders 中存储国家的 ID 而不是国家名称。因此,您不需要禁用条形码中的国家/地区名称 table.