2011-05-19 120 views
6

我已經被賦予了從Oracle數據庫中選擇關鍵數據的任務,但我注意到我的選擇正在返回重複的行。我不需要他們爲我的報告,但我不希望他們刪除它們。有人可以幫助獲取我需要的數據嗎?我已經嘗試了下面的代碼,但這沒有幫助。如何防止在選擇查詢中選擇重複行?

SELECT distinct bbp.SUBCAR "Treadwell", 
     bbp.BATCH_ID "Batch ID", 
     bcs.SILICON "Si", 
     bcs.SULPHUR "S", 
     bcs.MANGANESE "Mn", 
     bcs.PHOSPHORUS "P", 
     to_char(bcs.SAMPLE_TIME, 'dd-MON-yy hh24:MI') "Sample Time", 
     to_char(bbp.START_POUR, 'dd-MON-yy hh24:MI') "Start Pour Time", 
     to_char(bbp.END_POUR, 'dd-MON-yy hh24:MI') "End pour Time", 
     bofcs.temperature "Temperature" 
FROM bof_chem_sample bcs, bof_batch_pour bbp, bof_celox_sample bofcs 
WHERE bcs.SAMPLE_CODE= to_char('D1') 
AND bbp.BATCH_ID=bcs.BATCH_ID 
AND bcs.SAMPLE_TIME>=to_date('01-jan-10') 

回答

5

如果您查看轉換爲SQL Server類型SQL的查詢,您將看到表bofcs表與其餘數據之間沒有關係。基本上它會返回bofcs溫度場中的每個記錄,並且可能會產生重複結果?

SELECT 
    bbp.SUBCAR "Treadwell", 
    bbp.BATCH_ID "Batch ID", 
    bcs.SILICON "Si", 
    bcs.SULPHUR "S", 
    bcs.MANGANESE "Mn", 
    bcs.PHOSPHORUS "P", 
    to_char(bcs.SAMPLE_TIME,'dd-MON-yy hh24:MI') "Sample Time", 
    to_char(bbp.START_POUR, 'dd-MON-yy hh24:MI') "Start Pour Time", 
    to_char(bbp.END_POUR, 'dd-MON-yy hh24:MI') "End pour Time", 
    bofcs.temperature "Temperature" 
FROM 
    bof_chem_sample bcs, 
INNER JOIN 
    bof_batch_pour bbp, 
ON 
    bbp.BATCH_ID=bcs.BATCH_ID 
INNER JOIN 
    bof_celox_sample bofcs 
ON 
    **-- NO RELATION B/N BOFCS and the other tables????** 
WHERE 
    bcs.SAMPLE_CODE= to_char('D1') AND 
    bcs.SAMPLE_TIME>=to_date('01-jan-10') 
+0

好,我從來沒有發現過。這是一個完整的笛卡爾連接,難怪有很多重複:) – Datajam 2011-05-19 20:51:46

+0

謝謝,這是朝着正確方向邁出的一大步。因爲這一點,我注意到與數據庫本身的其他斷開連接。 – 2011-05-19 22:03:24

+0

在查詢中看到'distinct'應該可以響起警鐘。它通常掩蓋了查詢中或DB設計中的一些問題。 – 2011-05-20 06:24:29

6

如果你的SELECT語句中有一個DISTINCT,那麼所有返回的記錄都有跨您選擇的列值的唯一組合。您需要確定哪些列在您認爲要複製的記錄中返回不同的值。