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.
我正在努力处理 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.