我是学生,是数据库编程的新手,也是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一起不在上面的子查询中?
我希望你已经理解了我想说的话,并提前感谢您的回复
答案 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)
您可以使用except从OreProduction
表中获取ContractDetail
表中尚未包含的行。
select Mine, Ore
from OreProduction
except
select Mine, Ore
from ContractDetail
将其放入子查询中,然后将结果返回到Ore
和Mine
以获取名称。
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