2011-06-30 47 views
0

我的查詢返回的數據太多。這裏是查詢,一些樣本數據和我真正喜歡的樣本。精煉SQL查詢

select sd.ident,sd.suniq, td.testc, td.testuniq, td.subtestc, ts.testscore, ud.metadept, max(ts.takendt)AS testdate 
from studemo sd, stutests ts, testdef td, udefstu ud 
where ts.suniq =sd.suniq 
and td.testuniq = ts.testuniq 
and ts.suniq = ud.suniq 
and td.testuniq IN ('2000089', '2000090', '2000091', '2000092') 
group by sd.suniq, sd.ident, td.testc, td.subtestc, ts.testscore, ud.metadept, ts.takendt, td.testuniq 
order by suniq 

樣本輸出

ident suniq testc testuniq subtestc testscore metadept testdate 
102201 2001444 ADEPT 2000091 L3 23 NULL 09/01/2006 00:00 
102201 2001444 ADEPT 2000092 L4 7 NULL 06/01/2007 00:00 
101184 2001532 ADEPT 2000092 L4 5 NULL 09/01/2006 00:00 
101184 2001532 ADEPT 2000092 L4 7 NULL 06/01/2006 00:00 
101184 2001532 ADEPT 2000092 L4 7 NULL 06/01/2007 00:00 
590122 2001950 ADEPT 2000091 L3 22 NULL 06/01/2007 00:00 
590122 2001950 ADEPT 2000090 L2 32 NULL 09/01/2006 00:00 
141058 2004980 ADEPT 2000089 L1 27 NULL 05/01/2006 00:00 
141058 2004980 ADEPT 2000090 L2 28 NULL 01/25/2008 00:00 
141058 2004980 ADEPT 2000090 L2 27 NULL 06/01/2007 00:00 

通緝輸出

102201 2001444 ADEPT 2000092 L4 7 NULL 06/01/2007 00:00 
101184 2001532 ADEPT 2000092 L4 7 NULL 06/01/2007 00:00 
590122 2001950 ADEPT 2000091 L3 22 NULL 06/01/2007 00:00 
141058 2004980 ADEPT 2000090 L2 28 NULL 01/25/2008 00:00 
+0

您能否解釋示例輸出背後的邏輯?爲什麼'testuniq ='2000089'不包含在示例輸出中,即使該值在'IN'子句中列出? –

+0

樣品和想要的有什麼區別?它看起來像你正在尋找最新的'testdate'的行,但它可能是不同的 –

+0

也許我似乎無法理解你想要什麼......但是......你想要什麼樣的精煉?你只是想要更少的結果?還是有什麼特別的4個結果,你想要應該尋找? –

回答

0

試試這個。您有太多GROUP BY條件,並且需要在其餘字段上進行彙總。從你期望的輸出,他們看起來都像MAX值對我說:

select sd.ident, 
     sd.suniq, 
     td.testc, 
     MAX(td.testuniq) as TestUniq, 
     MAX(td.subtestc) as Subtestc, 
     MAX(ts.testscore) as TestScore, 
     MAX(ud.metadept) as metadept, 
     max(ts.takendt)AS testdate 
from studemo sd, stutests ts, testdef td, udefstu ud 
where ts.suniq =sd.suniq 
and td.testuniq = ts.testuniq 
and ts.suniq = ud.suniq 
and td.testuniq IN ('2000089', '2000090', '2000091', '2000092') 
group by sd.suniq, sd.ident, td.testc, 
order by suniq 
0

我想我知道你是什麼之後,你想獲得最新的(或最高值)項專門顯示...有你嘗試過'distinct'關鍵字?如果我有一個測試數據集來嘗試幾個查詢,我將能夠很快得到正確的答案,但從我的頭頂拉它是另一個故事

select distinct sd.ident,sd.suniq ,td.testc,td.testuniq,td.subtestc,ts.testscore,ud.metadept,max(ts.takendt)AS testdate from studemo sd,stutests ts,testdef td,udefstu ud 其中ts.suniq = sd。 suniq and td.testuniq = ts.testuniq and ts.suniq = ud.suniq and td.testuniq IN('2000089','2000090','2000091','2000092') group by sd.suniq,sd .ident,td.testc,td.subtestc,ts.testscore,ud.metadept,ts.takendt,td.testuniq order by suniq desc

+0

'DISTINCT'只會讓你指定的字段的唯一組合,這將是所有的字段。 – JNK