我相信有人可能会提供一个详细解释的特定链接,但我会尝试以这种方式总结它。编写查询时,我尝试从要从中获取数据的表的位置列出表,并将其作为“FROM”子句中的第一个表。然后,根据关系(例如 ID)对其他表执行“JOIN”条件。在你的例子中
FROM
ddHistorical ddH
INNER JOIN ddCurrent ddC
on ddH.ID = ddC.ID
在这种情况下,INNER JOIN(与 JOIN 相同)ddHistorical 表是左表(首先列出我的样式一致性和缩进),而 ddCurrent 是右表。请注意,将它们连接在一起的我的 ON 标准也是 left alias.column = right alias table.column - 同样,这只是为了心理相关目的。
Inner Join(或 JOIN)意味着一条记录必须在每一侧都有一个匹配项,否则将被丢弃。
LEFT JOIN 意味着给我 LEFT 表(在本例中为 ddHistorical)中的所有记录,而不管右侧表(ddCurrent)中的匹配。在这个例子中不实用。
RIGHT JOIN 是相反的……给我右侧表中的所有记录,不管左侧表中的匹配记录。大多数情况下,您会看到 LEFT-JOIN 比 RIGHT-JOIN 更频繁。
现在,一个心理上获得左连接的样本。您在一家汽车经销商处工作,并且有一个包含 10 辆已售汽车的主表。对于给定的月份,您想知道什么不卖。因此,从所有汽车的主表开始,查看 DID 销售的销售表。如果没有此类销售活动,则右侧表将具有 NULL 值
select
M.CarID,
M.CarModel
from
MasterCarsList M
LEFT JOIN CarSales CS
on M.CarID = CS.CarID
AND month( CS.DateSold ) = 4
where
CS.CarID IS NULL
因此,我的 LEFT 加入基于匹配的汽车 ID - 并且 - 销售活动月份是 4 月(4 月),因为我可能不关心 1 月至 3 月的销售 - 但也符合年份,但这是一个简单的样本。
如果 Car Sales 表中没有记录,则所有列的值为 NULL。我只是碰巧关心汽车 ID 列,因为那是加入基础。这就是为什么我将它包含在 WHERE 子句中。对于确实有销售的所有其他类型的汽车,它将具有价值。
这是一种常见的方法,您将在查询某人在哪里寻找所有而不考虑其他人时看到...有些使用 where NOT EXIST ( subselect ),但那些执行速度较慢,因为它们对每条记录进行测试。加入要快得多。
其他例子可能是你想要一个公司所有员工的列表,如果他们有一些认证/培训来展示它......你仍然想要所有员工,但是左加入某些认证/培训表会暴露那些额外的字段如所须。
select
Emp.FullName,
Cert.DateCertified
FROM
Employees Emp
Left Join Certifications Cert
on Emp.EmpID = Cert.EmpID
希望这些示例可以帮助您更好地理解查询的关系,现在可以实际为您的需求提供答案。
如果您想要的是所有“当前”项目的列表并想查看它们的历史,我会使用当前的 FIRST。这可能是如果您当前的表是 50,但历史上您的表有 420 个项目。您不关心其他 360 项目,只关心那些当前的项目和这些项目的历史。
select
ddC.WhateverColumns,
ddH.WhateverHistoricalColumns
from
ddCurrent ddC
JOIN ddHistorical ddH
on ddC.ID = ddH.ID