我是一名控制工程师,对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?
答案 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);