我有一個查詢,我使用連接編寫來顯示使用部件的Serial_Number的摘要。T-SQL外部連接不起作用
很明顯,它不工作!
使用這裏的直接搜索:
select Serial_Number, Op_ID, Date_Time as 'DecayDate',
DECAY.System_ID AS 'DecayID', Test_Result as 'DecayResult'
from Test_Results
where serial_number='CP21295 1006 09' and system_id like '%decay%'
我得到這個樣本輸出:
Serial_Number Op_ID DecayDate DecayID DecayResult CP21295 1006 09 003468 2009-10-15 06:36:13.643 AA_DECAY_6 FAILED CP21295 1006 09 003468 2009-10-05 08:08:38.503 AA_DECAY_6 PASSED
注意有兩個(2)試驗,我需要這一個部件號的結果。
我們我創建的查詢不起作用:
這第一個版本將返回ONE記錄:
SELECT LABEL.Serial_Number,
DECAY.Op_ID,
DECAY.Date_Time AS 'DecayDate',
DECAY.System_ID AS 'DecayID',
CASE
WHEN DECAY.Test_Result LIKE '%fail%' THEN 'FAIL'
WHEN DECAY.Test_Result LIKE '%pass%' THEN 'PASS'
ELSE NULL
END AS 'DecayResult'
FROM
ACP_Parts AS LABEL
LEFT OUTER JOIN (
SELECT I.Serial_Number, I.Op_ID, I.Date_Time, I.System_ID, I.Test_Result
FROM Test_Results I
LEFT OUTER JOIN Test_Results O ON (
I.Serial_Number=O.Serial_Number) AND
(O.Date_Time<I.Date_Time) -- AND (O.Serial_Number IS NULL) // didn't work
WHERE
(I.Test_Result LIKE '%pass%' OR I.Test_Result LIKE '%fail%') AND
(I.System_ID like '%decay%') AND
(O.Test_Result LIKE '%pass%' OR O.Test_Result LIKE '%fail%') AND
(O.System_ID like '%decay%')
) AS DECAY ON
(LABEL.Serial_Number=DECAY.Serial_Number) AND
(LABEL.Date_Time<DECAY.Date_Time)
WHERE
(LABEL.Serial_Number IN (
SELECT DISTINCT Serial_Number
FROM ACP_Parts
WHERE (Serial_Number IS NOT NULL) AND
(DATEADD(yy, - 1, GETDATE()) < Date_Time)))
輸出
Serial_Number DecayOp DecayDate DecayID DecayResult CP21295 1006 09 003468 2009-10-15 06:36:13.643 AA_DECAY_6 PASS
我猜測上面的查詢會產生一個結果,因爲有兩個或更多的記錄要比較。對?
我修改了上面的查詢,希望能返回最新的紀錄,但是這個版本不返回任何東西:
SELECT LABEL.Serial_Number,
DECAY.Op_ID,
DECAY.Date_Time AS 'DecayDate',
DECAY.System_ID 'DecayID',
CASE
WHEN DECAY.Test_Result LIKE '%fail%' THEN 'FAIL'
WHEN DECAY.Test_Result LIKE '%pass%' THEN 'PASS'
ELSE NULL
END AS 'DecayResult'
FROM
ACP_Parts AS LABEL
LEFT OUTER JOIN (
SELECT TOP 1 Serial_Number, Op_ID, Date_Time, System_ID, Test_Result
FROM Test_Results
WHERE
(System_ID like '%decay%') AND
(Test_Result LIKE '%pass%' OR Test_Result LIKE '%fail%')
ORDER BY Date_Time DESC
) AS DECAY ON
(LABEL.Serial_Number=DECAY.Serial_Number) AND
(LABEL.Date_Time<DECAY.Date_Time)
WHERE
(LABEL.Serial_Number IN (
SELECT DISTINCT Serial_Number
FROM ACP_Parts
WHERE (Serial_Number IS NOT NULL) AND
(DATEADD(yy, - 1, GETDATE()) < Date_Time)))
輸出
Serial_Number DecayOp DecayDate DecayID DecayResult CP21295 1006 09 NULL NULL NULL NULL
莫非有人指出我如何才能使這個查詢返回罪結果我後?
正如@ Will A所問,你的目標是什麼?要獲得(每個)部分的最新測試結果? – 2010-07-16 21:28:20
是........... – jp2code 2010-07-16 21:31:51