2011-05-19 119 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,那么所有返回的记录都有跨您选择的列值的唯一组合。您需要确定哪些列在您认为要复制的记录中返回不同的值。