【问题标题】:SQL joining multiple tables along with multiple paramtersSQL 连接多个表和多个参数
【发布时间】:2017-06-24 14:29:26
【问题描述】:

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

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

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

我正在构建一个表,该表显示整个数据日志快照,其中包括来自浮点表和字符串表的一些数据。两者相互关联,因为它们的日期/时间记录匹配。
我需要将 Tag 表与 String 表和 Float 表相关联,并在记录的日期之前将 String 表与 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

^Code 有效,但与 FloatTable 和 StringTable 没有关系。 还将最后两行替换为以下内容,这是一个有效的查询,但没有产生我需要的内容:

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

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

如何让 DateAndTime 正确加入?

【问题讨论】:

    标签: sql sql-server join


    【解决方案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);
    

    【讨论】:

    • 感谢推荐!当我为我的行使用 f.DateAndTime 时,它​​仍然不等于日期,但这可能是由于我的行没有以某种方式正确设置。是否建议使用 s,f,t 来缩短名称?它当然读起来更好。我也在寻找一条新途径,并将所有数据转储到临时数据透视表中,以便更容易排序和过滤。
    • 检查DateAndTime,如果它们在表格中真的相等。也许它们只是在几微秒内不同,因此不匹配。
    • 关于别名:是的,在处理多个表时建议使用别名。使用什么名称取决于您。只需确保它们不会太长并且是表格的助记符(例如 f 代表浮点数,s 代表字符串)。
    猜你喜欢
    • 2020-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-03
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多