2016-07-27 123 views
0

我只是学习使用SQL Server来查询数据库(并最终创建我自己的)。我基本上试图复制我已经用Excel完成的大量工作,但这并不重要。SQL Server嵌套选择

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

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的值?

+0

所以,你要选择记录相同的名称表的别名,其中的标记名是“MasterFaults”或标记名为“跑步'AND值是1? – steamrolla

+0

“基本上我只需要选择”MasterFaults“TagName的行,其中'Running'的值为1。”只有0个结果具有'Running'和'MasterFaults'的标签名称。你的逻辑有些问题。 – Bistabil

+0

如果您发布代码,XML或数据样本,**请**在文本编辑器中突出显示这些行,然后单击编辑器工具栏上的“代码样本”按钮(“{}”)以精确地格式化和语法突出显示它! –

回答

2

这样的事情呢?

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/

此外,你真的应该避免使用保留字列名称。这使得写入查询变得更加痛苦。 (日期时间,价值等)

+0

不完全。我只想返回Masterfaults标签的值。但是,在相应的StartDateTime上'运行'的值必须是1.我认为我现在可能有一个更简单和更清晰的查询,当您说'对应'时记录对应的时候,只编辑我的问题 – Jamsandwich

+0

@jamsandwich?他们有匹配的StartTimeDate吗?只要事件保证有不同的时间和日期,那也可以, – Cato

+0

准确@AndrewDeighton我现在改变了我的原始问题。也许我应该保留前面的问题,但我认为这可能有一个更简单的解决方案。 – Jamsandwich

1
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是与