2016-07-27 119 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是與