SQL连接多个表以及多个参数

时间:2017-06-24 05:43:36

标签: sql sql-server join

我是一名控制工程师,对SQL的了解很少,但已经使用AB FactoryTalk,SQL Express 2012和Report Builder 3.0进行了一些报告。数据来自PLC并将数据记录到三个表中

  • 浮动表
  • 字符串表
  • 标签表

标签表包含标签名称和" TagIndex"以供参考。 Float表包含所有数字数据,并具有" TagIndex"使用与标记表中的标记名称匹配的数字。与String表相同的概念,保存字符串并具有" TagIndex"与标记表中的标记名称匹配。

我正在构建一个显示整个数据日志快照的表,其中包含来自Float Table和String Table的一些数据。两者都相互关联,因为他们的日期/时间记录匹配 我需要将Tag表与String和Float表相关联,并将记录日期的String Table与Float表相关联。

使用报表生成器中的查询设计器,我有一个半工作表,其中包含以下内容

SELECT
    StringTable.DateAndTime AS [StringTable DateAndTime]
    ,FloatTable.DateAndTime AS [FloatTable DateAndTime]
    ,FloatTable.TagIndex AS [FloatTable TagIndex]
    ,FloatTable.Val AS [FloatTable Val]
    ,StringTable.Val AS [StringTable Val]
    ,TagTable.TagIndex AS [TagTable TagIndex]
    ,TagTable.TagName
    ,TagTable.StartEnd
    ,TagTable.TableOrder
    ,TagTable.Label
    ,TagTable.Unit
    ,StringTable.TagIndex AS [StringTable TagIndex]
FROM TagTable
    FULL OUTER JOIN FloatTable
      ON TagTable.TagIndex = FloatTable.TagIndex
    FULL OUTER JOIN StringTable
      ON TagTable.TagIndex = StringTable.TagIndex

^代码有效但没有FloatTable和StringTable的关系。 也用下面的代码替换最后两行,这是一个有效的查询,但没有得到我需要的东西:

FULL OUTER JOIN StringTable
  ON TagTable.TagIndex = StringTable.TagIndex
  AND FloatTable.DateAndTime = StringTable.DateAndTime

数据用于表中,列为TagIndex / TagNames,行为DateAndTime。

如何正确加入DateAndTime?

1 个答案:

答案 0 :(得分:1)

完全外连接在这里确实是一个好主意,但仅适用于两个子表。

SELECT
     s.DateAndTime AS [StringTable DateAndTime]
    ,f.DateAndTime AS [FloatTable DateAndTime]
    ,f.TagIndex AS [FloatTable TagIndex]
    ,f.Val AS [FloatTable Val]
    ,s.Val AS [StringTable Val]
    ,t.TagIndex AS [TagTable TagIndex]
    ,t.TagName
    ,t.StartEnd
    ,t.TableOrder
    ,t.Label
    ,t.Unit
    ,s.TagIndex AS [StringTable TagIndex]
FROM FloatTable f
FULL OUTER JOIN StringTable s ON s.TagIndex = f.TagIndex AND s.DateAndTime = f.DateAndTime
INNER JOIN TagTable t ON t.TagIndex IN (s.TagIndex, f.TagIndex);