0

所以,好吧,我有几张桌子。我当前的查询针对“历史”表运行。我想做某种连接以从我的当前表中获取最新状态。这些表共享一个类似的列,称为“ID”

这是结构

ddCurrent
    -ID
    -Location
    -Status
    -Time

ddHistorical
    -CID (AI field to keep multiple records per site)
    -ID
    -Location
    -Status
    -Time

我现在的目标是做一个简单的连接,从 ddHistorical 获取所有变量,从 ddCurrent 获取当前状态。

我知道他们可以在 ID 上加入,因为他们两个在他们的 ID 表中都有相同的项目,我只是不知道哪种加入是合适的或为什么?

4

3 回答 3

0

我相信有人可能会提供一个详细解释的特定链接,但我会尝试以这种方式总结它。编写查询时,我尝试从要从中获取数据的表的位置列出表,并将其作为“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
于 2013-06-26T16:15:35.950 回答
0

AnINNER JOIN将省略任何ddHistorical没有对应IDin 的行ddCurrent

ALEFT JOIN将包括所有ddHistorical行,即使它们没有对应ID的 in ddCurrent,但ddCurrent值将为 null (因为它们是未知的)。

另请注意, aLEFT JOIN只是一种特定类型的外连接。暂时不要打扰其他人-您将要做的90%或更多将是INNERLEFT

要仅包含ddHistoricalID 所在ddCurrent

SELECT h.CID, h.ID, h.Location, h.Status, c.Status, h.Time
FROM ddHistorical h
INNER JOIN ddCurrent c ON h.ID = c.ID

如果您想包含行,ddHistorical即使 ID不在ddCurrent

SELECT h.CID, h.ID, h.Location, h.Status, c.Status, h.Time
FROM ddHistorical h
LEFT JOIN ddCurrent c ON h.ID = c.ID

如果所有ddHistorical行都恰好与 中的 ID 匹配ddCurrent,请注意两个查询将返回相同的结果。

于 2013-06-26T15:49:11.623 回答
0

如果总是有一个当前字段,那么一个简单的 INNER JOIN 就可以了

SELECT a.CID, a.ID, a.Location, a.Status, a.Time, b.Status
FROM ddHistorical a
INNER JOIN ddCurrent b
ON a.ID = b.ID
于 2013-06-26T15:47:00.110 回答