SQL语句 - 太愚蠢了解它

时间:2015-02-25 21:45:33

标签: sql-server-2008

我具有SQL Server的工作知识以及执行大多数基本查询的能力。但是,我被困住了,需要一些帮助。我有6个相关的表,我需要从中获取一组数据。

表格如下:

MTMeterReadings先生

  • 实际
  • 的GroupID
  • MeterID
  • CREATEDATE

MTMeterReadingGroups mg

  • MeterReadingGroupID
  • MeterSourceID
  • EquipmentID

MTMeterSources ms

  • MeterSourceID
  • 描述

MTMeters m

  • MeterID
  • 描述

SCEquipment eq

  • EquipmentID
  • 客户id

ARCustomers c

  • 客户id
  • 客户名称

我想要的结果集是显示MTMeterReadins表中每个实际记录的以下数据,其中mr.CreateDate> 'MM / DD / YYY':

mr.actual | mr.CreateDate | ms.description | e.EquipmentID | c.CustomerName

到目前为止,我已经能够创建一个包含c.CustomerName所需的所有内容的查询,但似乎无法完全接受(我有时可能会受到挑战)。

非常感谢任何帮助。


我道歉,但我不知道我已经拥有的查询是否有帮助。

除了客户名称之外,以下是我所拥有的产品:

SELECT   
   mg.EquipmentID, 
   CAST(mr.Actual AS decimal(12, 0)) AS Meter, 
   CAST(mr.CreateDate AS DATE) AS MeterDate, 
   ms.MeterSource, m.Description
FROM     
   MTMeterReadings AS mr 
INNER JOIN
   MTMeterReadingGroups AS mg ON mr.MeterReadingGroupID = mg.MeterReadingGroupID 
INNER JOIN
   MTMeterSources AS ms ON mg.MeterSourceID = ms.MeterSourceID 
INNER JOIN
   MTMeters AS m ON mr.MeterID = m.MeterID
WHERE    
   (mr.CreateDate >= '01/01/2014') AND (mr.CreateDate <= '02/20/2015')
ORDER BY 
   MeterDate DESC, mg.EquipmentID, m.Description

但是,我为添加CustomerName所做的每次尝试都会产生mr表中的多个记录。我无法确切地说出我的错误是什么,但我认为这是一个错误的连接。对于拥有比我更大的SQL大脑的人来说,这可能很简单,但是当我从SAMS“在10分钟内自学SQL”一书中学习SQL时,这远不是我的核心知识库。

2 个答案:

答案 0 :(得分:0)

您缺少额外的2个联接:

SELECT   mg.EquipmentID, CAST(mr.Actual AS decimal(12, 0)) AS Meter, CAST(mr.CreateDate AS DATE) AS MeterDate, ms.MeterSource, m.Description, ar.CustomerName
FROM     MTMeterReadings AS mr INNER JOIN
            MTMeterReadingGroups AS mg ON mr.MeterReadingGroupID = mg.MeterReadingGroupID INNER JOIN
            MTMeterSources AS ms ON mg.MeterSourceID = ms.MeterSourceID INNER JOIN
            MTMeters AS m ON mr.MeterID = m.MeterID
INNER JOIN SCEquipment eq on mg.EquipmentID = eq.EquipmentID
INNER JOIN ARCustomers ar on eq.CustomerID = ar.CustomerID
WHERE    (mr.CreateDate >= '01/01/2014') AND (mr.CreateDate <= '02/20/2015')
ORDER BY MeterDate DESC, mg.EquipmentID, m.Description

答案 1 :(得分:0)

应该这么简单:

SELECT mg.EquipmentID,
    CAST(mr.Actual AS DECIMAL(12, 0)) AS Meter,
    CAST(mr.CreateDate AS DATE) AS MeterDate,
    ms.MeterSource,
    m.Description
    c.CustomerName
FROM MTMeterReadings     AS mr INNER JOIN 
    MTMeterReadingGroups AS mg ON mr.MeterReadingGroupID = mg.MeterReadingGroupID INNER JOIN 
    MTMeterSources       AS ms ON mg.MeterSourceID = ms.MeterSourceID INNER JOIN 
    MTMeters             AS m  ON mr.MeterID = m.MeterID INNER JOIN 
    SCEquipment          AS e  ON mg.EquipmentID = e.EquipmentID INNER JOIN 
    ARCustomers          AS c  ON e.CustomerID = c.CustomerID
WHERE (mr.CreateDate BETWEEN '01/01/2014' AND '02/20/2015')
ORDER BY MeterDate DESC,
    mg.EquipmentID,
    m.Description

但是假设没有可能的外部联接,并且您想要的每个关系都至少有一条记录。

另请注意,如果mr.CreateDatedatetime,您将在午夜后的2015年2月20日错过次数。