SQL Запрос создает слишком много повторяющихся строк - PullRequest
0 голосов
/ 16 января 2020

У меня проблема с запросом sql и тем, как отображается вывод, видите, у меня есть 3 таблицы и у меня есть хотя бы одно общее поле, дело в том, что когда я объединяю 2 таблицы вместе, мне нужна информация отображается правильно, но когда я присоединяюсь к третьему, вывод становится безумным и дублирует результаты слишком много, и мне нужно выяснить, почему это происходит, внизу я покажу вам все таблицы и отношения между собой

это то, как таблицы связаны друг с другом

l

Так первая таблица (dbo_pred ios) становится первой три поля являются единственными релевантными в этом случае enter image description here

Таким образом, вторая таблица (dbo_permisos_obras_mayores) сделана так, что первые три поля являются единственными релевантными в этом случае, вторые два могут соответствовать первой таблице (dbo_pred ios) enter image description here

И вот как создается третья таблица (dbo_recepciones_obras_mayores), четвертое поле является единственным релевантным в этом случае, он может относиться ко второй таблице (dbo_permisos_obras_mayores) к тому же полю имени

enter image description here

хорошо, теперь это структурно Теперь запрос, который я выполняю, выглядит следующим образом:

SELECT
dbo_predios.codigo_unico_predio,
dbo_permisos_obras_mayores.numero_permiso_edificacion,
dbo_permisos_obras_mayores.fecha_permiso_edificacion
FROM dbo_predios
INNER JOIN  dbo_permisos_obras_mayores ON dbo_predios.codigo_manzana_predio = dbo_permisos_obras_mayores.codigo_manzana_predio AND dbo_predios.codigo_lote_predio = dbo_permisos_obras_mayores.codigo_lote_predio
INNER JOIN  dbo_recepciones_obras_mayores ON dbo_permisos_obras_mayores.numero_recepcion_permiso = dbo_recepciones_obras_mayores.numero_recepcion_permiso
WHERE       dbo_permisos_obras_mayores.codigo_manzana_predio = 9402 AND dbo_permisos_obras_mayores.codigo_lote_predio = 30

И результат выполнения запроса таким образом:

enter image description here

Позже я сделал несколько проб и ошибок и удалил вторую внутреннюю линию соединения, и результат меня удивил, вот что произошло:

enter image description here

Вывод: вкратце третья таблица вызывает декартово произведение, почему? я wi sh я знал почему, что вы думаете об этом конкретном случае? Я хотел бы поблагодарить вас за любую помощь, которую вы могли бы оказать мне, спасибо заранее.

Ответы [ 3 ]

2 голосов
/ 16 января 2020

Вот решение - так как вы говорите, что Numberro_recepcion_permiso пустое, просто добавьте условие к внутреннему соединению, чтобы исключить пустые:

SELECT
dbo_predios.codigo_unico_predio,
dbo_permisos_obras_mayores.numero_permiso_edificacion,
dbo_permisos_obras_mayores.fecha_permiso_edificacion
FROM dbo_predios
INNER JOIN  dbo_permisos_obras_mayores ON dbo_predios.codigo_manzana_predio = dbo_permisos_obras_mayores.codigo_manzana_predio AND dbo_predios.codigo_lote_predio = dbo_permisos_obras_mayores.codigo_lote_predio
INNER JOIN  dbo_recepciones_obras_mayores ON dbo_permisos_obras_mayores.numero_recepcion_permiso = dbo_recepciones_obras_mayores.numero_recepcion_permiso 
            AND dbo_recepciones_obras_mayores.numero_recepcion_permiso <>''
WHERE       dbo_permisos_obras_mayores.codigo_manzana_predio = 9402 AND dbo_permisos_obras_mayores.codigo_lote_predio = 30

С учетом сказанного, должно ли это поле быть разрешено пусто или NULL? Возможно, вам нужно добавить ограничение к вашей таблице, чтобы предотвратить этот сценарий. Другое предложение - почему вы выбрали NUMERIC(18,0) в качестве типа данных первичного ключа для этих таблиц? Я бы предпочел простой INT или BIGINT и, возможно, позволить базе данных сгенерировать последовательность для меня.

1 голос
/ 16 января 2020

Прежде всего, убедитесь, что оба значения существуют в обоих полях и они действительно совпадают, иначе может генерировать такое количество повторяющихся строк, однако количество повторяющихся строк я не могу сказать, так как не знаю, что ваши фактические данные, но это может прояснить немного, что проблема

1 голос
/ 16 января 2020

Хорошо, я сделал то, что сказал мне Икар, и я выяснил кое-что полезное, понимаете, я допустил большую ошибку, и у комбинации чисел, которую я пробовал, не было numero_recepcion_permiso, поэтому выходной столбец полностью пусто, однако, когда есть фактический numero_recepcion_permiso, он показывает правильно, в любом случае мне все еще нужно, чтобы не выводилось так много повторяющихся строк, как я могу это исправить? пока что всем спасибо за помощь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...