Ошибка Oracle? ВЫБОР не возвращает простофиль, ВСТАВЬТЕ от ВЫБОРА, имеет дублирующиеся строки

функции Даты . Я должен обработать большую информацию времени и строки даты целый день, так функции как strftime () и , strtotime () являются просто потрясающими.

7
задан Joe Harris 9 December 2009 в 11:43
поделиться

7 ответов

Одна вещь, которая приходит на ум, заключается в том, что обычно план оптимизатора для SELECT предпочитает план FIRST_ROWS, чтобы вернуть строки обратно вызывающей стороне раньше, но INSERT ... SELECT предпочтет ALL_ROWS план, так как он должен будет доставить полный набор данных. Я бы проверил планы запросов с помощью DBMS_XPLAN.DISPLAY_CURSOR (используя sql_id из V $ SQL).

У меня запущено полусложное представление по ссылке БД; 4 внутренних соединения большие таблицы и 5 левых соединений столы среднего размера. ... Все таблицы в запросе включены ссылка на базу данных

Опять же, потенциальная проблема. Если бы все таблицы в SELECT находились на другом конце связи с БД, весь запрос был бы отправлен в удаленную базу данных и возвращен набор результатов. После того, как вы добавите INSERT, более вероятно, что локальная база данных возьмет на себя ответственность за запрос и вытянет все данные из дочерних таблиц. Но это может зависеть от того, определено ли представление в локальной или удаленной базе данных. В последнем случае, что касается локального оптимизатора, существует только один удаленный объект, и он получает данные от него, а удаленная база данных выполнит соединение.

Что произойдет, если вы просто перейдете к удаленной базе данных и выполните ВСТАВКА на столе там?

3
ответ дан 7 December 2019 в 01:22
поделиться

Я не могу не думать, что, возможно, вы испытываете побочный эффект от что-то еще, связанное с таблицей. Есть ли триггеры, которые могут управлять данными?

0
ответ дан 7 December 2019 в 01:22
поделиться

Мне приходит в голову несколько вариантов.

  1. Обдуманные вами копии уже были в целевой таблице ??

  2. Если в вашем Select вы ссылаетесь на таблицу, в которую вставляете, (?), То Insert взаимодействует с select в вашей комбинированной

    Insert ...

0
ответ дан 7 December 2019 в 01:22
поделиться

Как вы определили, что в исходной таблице нет дубликатов?

Как отмечали другие, это кажется самым простым объяснением такого странного поведения.

0
ответ дан 7 December 2019 в 01:22
поделиться

Внимательно проверьте свои JOIN . Возможно, у вас нет дубликатов в отдельных таблицах, но неуказанные соединения могут вызвать непреднамеренные CROSS JOIN s, так что ваш результирующий набор будет иметь дубликаты из-за множественности, и при вставке это нарушает ограничение уникальности в вашей целевой таблице.

В этом случае я вкладываю запрос в представление или CTE и пытаюсь обнаружить дубликаты прямо из SELECT :

WITH resultset AS (
    -- blah, blah
)
SELECT a, b, c, COUNT(*)
FROM resultset
GROUP BY a, b, c
HAVING COUNT(*) > 1
0
ответ дан 7 December 2019 в 01:22
поделиться

Я бы посоветовал составить план запроса, который вы выполняете, и найти там CARTESIAN JOIN. Это может указывать на отсутствие условия, вызывающего дублирование строк.

0
ответ дан 7 December 2019 в 01:22
поделиться

AS @Pop уже предположил, что такое поведение может произойти, если вы используете другой логин в SQLPlus, чем логин, когда ваша вставка работает. (То есть, если у другого логина есть таблица / представление / синоним с тем же именем)

0
ответ дан 7 December 2019 в 01:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: