如果我理解正確的這個,你是因爲ON
謂詞的基數返回所有匹配的行有問題。
EV.Test_Result.test_row_id = t.test_row_id
and EV.Test_Result.start_time < t.start_time
這ON
將比較所有具有相同的ID和返回的結果集,其中START_TIME比t.start_time較小的每一個組合的START_TIME值。顯然,這不是你想要的。
and t.device_id = 1219
and t.waived = 0
這實際上是一個謂詞(ON
技術就是其中之一),但我寧願在subquery
/CTE
使用這種有以下幾個原因:你限制SQL
必須檢索和比較的行數。
類似下面的可能是你需要的東西:
SELECT A.test_row_id
, A.test_result_id
, A.waived
, A.pass
, A.comment
FROM EV.Test_Result A
INNER JOIN (SELECT MAX(start_time) AS start_time
, test_row_id
FROM EV.Test_Result
WHERE device_id = 1219
AND waived = 0
GROUP BY test_row_id
) AS T ON A.test_row_id = T.test_row_id
AND A.start_time < T.start_time
ORDER BY A.test_row_id
該查詢然後返回在ON
謂詞值之間的關係1:M
,不像M:M
查詢你已經用完。
UPDATE:
如你所知,你寫的: 因爲我不好意思地搞砸了試圖改變我的質疑SO
,我將解釋基本SQL
查詢經營者的物理和邏輯順序挽救自己一個簡單的SELECT
聲明如下所示:
SELECT <aggregate column>, SUM(<non-aggregate column>) AS Cost
FROM <table_name>
WHERE <column> = 'some_value'
GROUP BY <aggregate column>
HAVING SUM(<non-aggregate column>) > some_value
ORDER BY <column>
請注意,如果您使用聚合函數,所有其他列必須出現在GROUP BY或其他功能。
現在,SQL Server需要它們被寫入的順序,雖然它實際上是由下面的順序,是值得記憶處理此邏輯:
- FROM,WHERE,GROUP BY,HAVING,SELECT,ORDER BY
上有SELECT - MSDN發現了更多的細節,但是這就是爲什麼在SELECT
運營商的任何列必須在group by或在聚合函數(SUM
,MIN
,MAX
等)...和也是爲什麼我的懶惰代碼失敗你第一次嘗試。 :/ 另請注意,ORDER BY
是最後一個(技術上TOP
運算符在此之後發生),沒有它的結果不確定,除非諸如DENSE_RANK
之類的函數強制執行它(認爲這發生在SELECT
語句中)。
希望這有助於解決問題,並且更好地瞭解SQL如何工作。乾杯
如果您有一個返回唯一時間戳(意味着至少是日期時間)的日期列,那麼使用MAX函數很容易。但是,如果不是......那麼也許是你的表結構中的設計缺陷。 –
我們確實有一個datetime2的start_time列。我也嘗試了最大值,但是無法正確寫入。你有一個例子嗎?我不擅長SQL,這不是我的主要工作描述(儘管我正在努力學習!)。 – Johonn
最後一個建議是使用縮進格式化查詢。 SQL忽略不在字符串中的內聯空間('THIS IS STRING IN SQL')(注意(')是SQL中的字符串分隔符) –