Метод SQL проверки того, что соединение INNER / LEFT не дублирует строки - PullRequest
0 голосов
/ 27 сентября 2011

Существует ли хороший или стандартный метод SQL для подтверждения того, что объединение не дублирует строки (создает 0 или 1 копию строки исходной таблицы)?Утверждение, как в, приводит к сбою в запросе или иным образом указывает на наличие дублирующихся строк.

Распространенной проблемой во многих запросах является ситуация, когда ожидается, что таблица будет 1: 1 с другой таблицей, но она может существовать2 строки, которые соответствуют критериям соединения.Это может привести к ошибкам, которые трудно отследить, особенно для людей, не обязательно полностью знакомых с таблицами.

Кажется, что должно быть что-то простое и элегантное - это было бы очень легкодля механизма SQL для обнаружения (я уже присоединил эту исходную строку к строке в другой таблице? хорошо, ошибка отсутствует), но я не могу ничего найти по этому вопросу.Я знаю, что есть длинные / навязчивые решения этой проблемы, но для многих специальных запросов это просто не очень интересно.

РЕДАКТИРОВАТЬ / УТОЧНИТЬ: Я ищу одно-пошаговое исправление уровня запроса.Не является этапом проверки результатов этого запроса.

Ответы [ 3 ]

2 голосов
/ 27 сентября 2011

Если вы только тестируете для связанных строк, а не нуждаетесь в выводе, тогда вы будете использовать EXISTS.

Точнее, вам нужно "semi-join", но это не такt поддерживается большинством СУБД, кроме как EXISTS

SELECT a.*
FROM TableA a
WHERE EXISTS (SELECT * FROM TableB b WHERE a.id = b.id)

См. также:

1 голос
/ 27 сентября 2011

Что-то вроде

SELECT a.id, COUNT(b.id)
FROM TableA a
JOIN TableB b ON a.id = b.id
GROUP BY a.id
HAVING COUNT(b.id) > 1

Должно возвращать строки в TableA, которые имеют более одной связанной строки в TableB.

1 голос
/ 27 сентября 2011
SELECT JoinField
FROM MyJoinTable
GROUP BY JoinField
HAVING COUNT(*) > 1
LIMIT 1

Это достаточно просто? У меня нет Postgres, но я думаю, что это правильный синтаксис.

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