Sql 选择包含连接表的查询

Sql 选择包含连接表的查询,sql,oracle,select,junction,Sql,Oracle,Select,Junction,我有三张桌子: 产品 产品标识 名字 描述 价格 供应商 供应商ID 名字 位置 产品供应商 产品标识 供应商ID ProductSupplier是连接表,而不是多对多关系 我需要创建一个SELECT语句,该语句将返回两列:产品的名称和价格(而不是产品ID),但前提是供应商位于澳大利亚。结果中无法显示供应商的位置 我知道在没有连接表的情况下如何执行此操作,但这让我感到困惑。下面的sql语句将返回所有产品,其中至少有位于澳大利亚的供应商 select distinct p.Name,p

我有三张桌子:

产品

  • 产品标识
  • 名字
  • 描述
  • 价格
供应商

  • 供应商ID
  • 名字
  • 位置
产品供应商

  • 产品标识
  • 供应商ID
ProductSupplier
是连接表,而不是多对多关系

我需要创建一个
SELECT
语句,该语句将返回两列:产品的名称和价格(而不是产品ID),但前提是
供应商位于澳大利亚。结果中无法显示供应商的位置


我知道在没有连接表的情况下如何执行此操作,但这让我感到困惑。

下面的sql语句将返回所有产品,其中至少有位于澳大利亚的供应商

select distinct p.Name,p.Price
from Product  p
inner join ProductSupplier  ps on ps.Product_ID = p.Product_ID
inner join Supplier  s on s.Supplier_ID = ps.Supplier_ID
where s.Location = 'Australia'

如果您可以避免
选择distinct
(和
计数(distinct)
),那么这是一个好主意。它们在删除重复项时会产生额外的开销

因此,最好的方法是在
where
子句中使用
in
exists
进行过滤:

select p.Name, p.Price
from Product p
where exists (select 1
              from ProductSupplier ps inner join
                   Supplier s
                   on s.Supplier_ID = ps.Supplier_ID
              where ps.Product_ID = p.Product_ID and s.Location = 'Australia'
             );

这应该有最好的执行计划。

似乎一个产品可以有很多供应商。您是在寻找至少有一家供应商不在澳大利亚的产品,还是寻找在澳大利亚根本没有供应商的产品?谢谢。我以前没有见过使用distinct,这段代码中使用distinct做什么?它返回的结果没有重复。我得到以下错误消息:在第2行:ORA-00933:SQL命令未正确结束时,从PRODUCT AS P*错误