【问题标题】:SQL Server Nested SelectSQL Server 嵌套选择
【发布时间】:2016-07-27 14:06:11
【问题描述】:

我只是在学习使用 SQL Server 来查询数据库(并最终创建我自己的)。我基本上是在尝试复制我已经用 Excel 完成的许多工作,但这不是重点。

编辑:这可能是一个更清晰的查询 -

SET NOCOUNT ON
DECLARE @StartDate DateTime
DECLARE @EndDate DateTime
SET @StartDate = DateAdd(mi,-10,GetDate())
SET @EndDate = GetDate()
SET NOCOUNT OFF

SELECT StartDateTime, TagName, Value
FROM History
WHERE TagName IN ('Master', 'Running')
  AND DateTime >= @StartDate
  AND DateTime <= @EndDate

这会返回如下内容:

Row     StartDateTime             TagName     Value
-----------------------------------------------------
1       2016 07 27 15.01.39       Master       154
2       2016 07 27 15.01.39       Running        0
3       2016 07 27 15.01.40       Master       154
4       2016 07 27 15.01.40       Running        0
5       2016 07 27 15.01.41       Master       154
6       2016 07 27 15.01.41       Running        1
7       2016 07 27 15.01.42       Master        65
8       2016 07 27 15.01.42       Running        0

您可以看到StartDateTime 重复了两行。是否可以在同一行中获取一个 StartDateTime 的值?

【问题讨论】:

  • 所以您想选择 TagName 为“MasterFaults”或 TagName 为“Running”且值为 1 的记录?
  • "基本上我只需要选择 'MasterFaults' TagName 的行,其中 'Running' 的值 = 1。"正好有 0 个结果的标签名称为“正在运行”和“MasterFaults”。你的逻辑有问题。
  • 如果您发布代码、XML 或数据示例,在文本编辑器中突出显示这些行,然后单击编辑器上的“代码示例”按钮 ({ })工具栏以很好地格式化和语法突出显示它!

标签: sql-server database join nested


【解决方案1】:

这样的事情怎么样?

SELECT StartDateTime
    , TagName
    , Value
FROM History
WHERE DateTime >= @StartDate
    AND DateTime <= @EndDate
    AND
    (
        TagName = 'MasterFaults'
        OR
        (
            TagName = 'Running'
            AND 
            Value = 1
        )
    )

--编辑--

您已经大大改变了问题。可悲的是,它仍然不是很清楚你想要什么。也许这会将您推向正确的方向。

SELECT m.StartDateTime
    , m.TagName as MasterTagName
    , m.Value as MasterValue
    , r.TagName as RunningTagName
    , r.Value as RunningValue
FROM History m
left join History r on r.StartDateTime = m.StartDateTime and r.TagName = 'Running' and r.Value = 1
WHERE m.TagName = 'Master'
    AND m.DateTime >= DateAdd(minute, -10, GetDate())
    AND m.DateTime <= GETDATE()

如果这仍然不是您想要的,您应该阅读这篇文章。 http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/

此外,您确实应该避免在列名中使用保留字。它使编写查询变得更加痛苦。 (日期时间、值等...)

【讨论】:

  • 不完全是。我只对返回 Masterfaults 标记的值感兴趣。但是对应的 StartDateTime 的“正在运行”的值必须为 1。我想我现在可能有一个更简单、更清晰的查询,只需编辑我的问题
  • @jamsandwich 当您说“对应”时,记录是如何对应的?他们有匹配的 StartTimeDate 吗?只要保证事件有不同的时间和日期,这可能没问题
  • 正是@AndrewDeighton 我现在改变了我原来的问题。也许我应该把上一个问题留在那里,但我认为这可能有一个更简单的解决方案。
【解决方案2】:
    SELECT H1.StartDateTime, H1.TagName, H1.Value, H2.TagName TagNameR, H2.Value ValueR
            FROM History H1 
                Join 
                History H2 
                    ON 
                        H1.DateTime = H2.DateTime 
                        AND
                        H1.TagName = 'Master'
                        AND
                        H2.TagName = 'Running'
            WHERE 
                 DateTime >= @StartDate
                 AND 
                 DateTime <= @EndDate;

H1和H2是同名表的别名

【讨论】:

    猜你喜欢
    • 2011-06-05
    • 2014-07-23
    • 1970-01-01
    • 1970-01-01
    • 2020-12-07
    • 2010-10-04
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    相关资源
    最近更新 更多