Я выполняю некоторые работы по обслуживанию приложения базы данных и обнаружил, что радость от радости, несмотря на то, что значения из одной таблицы используются в стиле внешних ключей, для таблиц нет ограничений по внешнему ключу.
Я пытаюсь добавить ограничения FK для этих столбцов, но я обнаружил, что, поскольку в таблицах уже содержится масса плохих данных из предыдущих ошибок, которые были наивно исправлены, мне нужно найти строки, которые не сопоставьте с другой таблицей, а затем удалите их.
Я нашел несколько примеров такого рода запросов в Интернете, но все они, кажется, дают примеры, а не объяснения, и я не понимаю, почему они работают.
Может ли кто-нибудь объяснить мне, как построить запрос, который возвращает все строки без совпадений в другой таблице, и что он делает, чтобы я мог сделать эти запросы самостоятельно, вместо того чтобы переходить к SO для каждой таблицы в этом беспорядке, которая имеет нет ограничений FK?
источник
NULL
в вашей схеме есть действительный идентификатор, у вас могут быть большие проблемы, вы не согласны? :)SELECT t1.ID, t2.ID
и удалите строку WHERE, вы лучше поймете, как это работает.Я бы использовал
EXISTS
выражение, так как оно более мощное, то есть вы можете более точно выбрать строки, к которым хотите присоединиться, в случае, еслиLEFT JOIN
вам нужно взять все, что находится в объединенной таблице. Его эффективность, вероятно, такая же, как в случаеLEFT JOIN
с нулевым тестом.источник
EXISTS
является его изменчивость.WHERE t2.id IS NULL
) Спасибо.В таблице 1 есть столбец, к которому вы хотите добавить ограничение внешнего ключа, но значения в
foreign_key_id_column
не все совпадают со значениемid
в таблице 2.id
из таблицы 1. Это будут строки, которые мы хотим удалить.NOT IN
в операторе where ограничивает запрос только строками, значенияforeign_key_id_column
которых в списке нет в таблице 2id
s.SELECT
Заявление в скобках будет получить список всехid
с , которые находятся в таблице 2.источник
IN
предложении со списком литеральных значений. Это не относится к использованиюIN
предложения с результатом подзапроса. Этот принятый ответ на этот вопрос фактически решает проблему с помощью подзапроса. (Большой список литеральных значений проблематичен, поскольку он создает огромное выражение SQL. Подзапрос работает нормально, потому что, даже если результирующий список большой, само выражение SQL мало.)Где
T2
находится таблица, к которой вы добавляете ограничение:И удалите результаты.
источник
Пусть у нас есть следующие 2 таблицы (зарплата и работник)
Теперь я хочу те записи из таблицы сотрудников, которых нет в зарплате. Мы можем сделать это тремя способами:
источник
От подобного вопроса здесь MySQL Внутренний Запрос Соединения, чтобы Получить Записи, Не Представленные в Другой Таблице, я получил это, чтобы работать
smalltable
где у вас есть пропущенные записи,bigtable
где у вас есть все записи. В списке запросов перечислены все записи, которые не существуют,smalltable
но существуют вbigtable
. Вы можете заменитьid
любым другим подходящим критерием.источник
Вы можете выбрать Просмотры , как показано ниже:
а затем поработайте в представлении для выбора или обновления:
который дает результат, как показано на рисунке ниже, то есть для несоответствующего столбца был заполнен нуль.
источник
Я не знаю, какой из них оптимизирован (по сравнению с @AdaTheDev), но этот, кажется, быстрее, когда я использую (по крайней мере, для меня)
Если вы хотите получить любой другой конкретный атрибут, вы можете использовать:
источник
SELECT * FROM First_table MINUS SELECT * FROM другого
источник
Вы можете сделать что-то вроде этого
источник
Как выбрать строки без соответствующей записи в таблице «Оба»?
источник