SQL将两个属性比较为1个组合

时间:2011-03-24 20:59:19

标签: sql sql-server

我是学生,是数据库编程的新手,也是Stack Overflow的新手!

基本上我有一个数据库,其中包含:

表=>属性

Mine => MineID, Name, NumberOfWorkers
Ore => OreID, Name, ChemicalFormula                 
OreProduction => OreProdID, Mine, Ore, AmountPerYear
Contract = > ContractID, Ore, Mine, Smelter, AmountOfOre

还有其他表,但我认为这些是与我的问题相关的表。

现在我的问题是:

“哪些矿山有能力开采他们尚未与冶炼厂签订合同的矿石,并且 他们是什么矿石?“

现在,这给了我所有可以开采矿石并将其与冶炼厂签订合同的矿山

SELECT DISTINCT Mine.Name, Ore.Name
FROM OreProduction
INNER JOIN Mine
ON Mine.MineID = OreProduction.Mine
INNER JOIN Ore
ON Ore.OreID = OreProduction.Ore
INNER JOIN ContractDetail
ON OreProduction.Mine = ContractDetail.Mine
AND OreProduction.Ore = ContractDetail.Ore

我怎样才能获得相反的结果? 我已经尝试将其用作子查询但是如何告诉SQL Mine和Ore一起不在上面的子查询中?

我希望你已经理解了我想说的话,并提前感谢您的回复

3 个答案:

答案 0 :(得分:1)

尝试LEFT JOIN并使用WHERE子句:

SELECT DISTINCT Mine.Name, Ore.Name
FROM OreProduction
INNER JOIN Mine
ON Mine.MineID = OreProduction.Mine
INNER JOIN Ore
ON Ore.OreID = OreProduction.Ore
LEFT JOIN ContractDetail
ON OreProduction.Mine = ContractDetail.Mine
AND OreProduction.Ore = ContractDetail.Ore
WHERE Contract.Mine is null

答案 1 :(得分:1)

INNER JOIN只返回符合连接条件的行,并从任一表中遗漏任何不匹配的行。

LEFT或RIGHT联接将从一个表(左侧或右侧)返回 all 数据,并从另一个表中返回匹配的数据。如果没有匹配的行,则输出中的列为NULL。

因此,提示是:尝试从Ore到ContractDetail执行LEFT OUTER JOIN,然后使用WHERE子句过滤结果,该子句在合同详细信息中专门查找“null”。

答案 2 :(得分:1)

您可以使用exceptOreProduction表中获取ContractDetail表中尚未包含的行。

select Mine, Ore
from OreProduction
except
select Mine, Ore
from ContractDetail

将其放入子查询中,然后将结果返回到OreMine以获取名称。

select 
  M.Name,
  O.Name
from  
  (select Mine, Ore
   from OreProduction
   except
   select Mine, Ore
   from ContractDetail) as P
  inner join Mine as M
    on M.MineID = P.Mine
  inner join Ore as O
    on O.OreID = P.Ore  
相关问题