#oracle #duplicate-removal
#Oracle #дубликаты
Вопрос:
Мне была поставлена задача выбора ключевых данных из базы данных Oracle, но я замечаю, что мой select возвращает повторяющиеся строки. Они мне не нужны для моего отчета, но я не хочу, чтобы они их удаляли. Не мог бы кто-нибудь помочь получить только те данные, которые мне нужны. Я пробовал следующий код, но это не помогает.
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')
Ответ №1:
Если в вашем операторе SELECT есть DISTINCT, то все возвращаемые записи имеют уникальную комбинацию значений в выбранных вами столбцах. Вам необходимо определить, какие столбцы возвращают разные значения в записях, которые, по вашему мнению, дублируются.
Ответ №2:
Если вы посмотрите на запрос, переведенный в 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')
Комментарии:
1. Хороший улов, я этого никогда не замечал. Это полное декартово соединение, неудивительно, что здесь много дубликатов 🙂
2. Спасибо, это был большой шаг в правильном направлении. Из-за этого я заметил некоторые другие отключения от самой базы данных.
3. Просмотр
distinct
в запросе, вероятно, должен вызвать тревогу. Обычно это скрывает какую-то проблему в запросе или в дизайне БД.4. Как мне просмотреть запрос, переведенный в SQL Server типа SQL?