如何使用连接而不是两个子查询

时间:2017-02-15 21:19:08

标签: sql join subquery

我有两个查询,这些查询原本是我想要在连接上执行的子查询,但我不确定如何正确执行此操作。

我的小示例表看起来像这样

SupplierId|CompanyName|Country

这些字段是必填字段,因此可以将它们全部加入。我的原始子查询看起来像这样

select *
from Suppliers
where CompanyName != 'Nord-Ost-Fisch Handelsgesellschaft mbH'and Country = 
(Select country 
from Suppliers 
where CompanyName = 'Nord-Ost-Fisch Handelsgesellschaft mbH');

我的查询的第一部分是查找属于公司名称的国家/地区并返回Germay

Select Country
From Suppliers 
Where CompanyName = 'Nord-Ost-Fisch Handelsgesellschaft mbH'

我的查询的第二部分找到与上述查询相关的所有供应商。 Where Country = 'Germany'不应该被硬编码。

Select *
From Suppliers
Where Country = 'Germany' -- this based on above statement
 and CompanyName != 'Nord-Ost-Fisch Handelsgesellschaft mbH'

我正在尝试的查询看起来像这样

 Select *
 From Suppliers s join Suppliers ss
 on s.SupplierID = ss.SupplierID
 Where ...

我只是没有看到如果我加入这两个表格,我如何仍然可以获得德国的国家,然后查询该结果。

1 个答案:

答案 0 :(得分:2)

首先,在这种情况下,没有固有的原因可以让你不能保留子查询;我实际上认为它使意图更加明显。

但是如果你想要一个自我加入,那么它的外观就是这样(我使用s表将返回实际的供应商信息,而c表示简单的表按国家过滤):

select s.*
from Suppliers s
inner join Suppliers c
    ON s.Country = c.Country
WHERE c.CompanyName = 'Nord-Ost-Fisch Handelsgesellschaft mbH'
AND s.CompanyName <> 'Nord-Ost-Fisch Handelsgesellschaft mbH'

具体说明您要过滤的表字段。

或者,如果您愿意,可以将过滤器放在c上作为连接的一部分:

select s.*
from Suppliers s
inner join Suppliers c
    ON s.Country = c.Country
    AND c.CompanyName = 'Nord-Ost-Fisch Handelsgesellschaft mbH'
WHERE s.CompanyName <> 'Nord-Ost-Fisch Handelsgesellschaft mbH'