База данных, с которой я работаю в настоящее время, имеет две таблицы, одна из которых содержит атрибут "contact_person". Этот атрибут сравнивается с несколькими атрибутами (, а не кортежами! ) в другой таблице, которые называются от «contact1» до «contact4», чтобы определить, какие другие атрибуты отображать из второй таблицы (то есть «email1» - «email4» «). Таким образом, первая таблица содержит только контактное лицо, а вторая - данные фактического адреса для нескольких контактных лиц (опять-таки, все они подряд или один кортеж). Не говорите мне, что это не правильный дизайн базы данных - я должен работать с тем, что мне дали -.-
Чтобы получить правильные контактные данные, я решил выполнить выборку для каждого сравнения и объединить их. Это работает нормально и выполняется достаточно хорошо для приложения, которое выполняет запрос. Выглядит очень упрощенно, примерно так:
SELECT contact1, email1, phone1 FROM T1,T2 WHERE contact_person = contact1
UNION ALL
SELECT contact2, email2, phone2 FROM T1,T2 WHERE contact_person = contact2
UNION ALL
SELECT contact3, email3, phone3 FROM T1,T2 WHERE contact_person = contact3
UNION ALL
SELECT contact4, email4, phone4 FROM T1,T2 WHERE contact_person = contact4
Теперь, из-за некорректных и не проверенных на ошибки запросов INSERT, возможно, что "contact_person" равен NULL или пустой строке или что любой из атрибутов "contactN" равен NULL. Поэтому мне нужен еще один запрос SELECT, который отображает все записи, которые находятся в базе данных, но еще не находятся в наборе записей .
На данном примере это может быть достигнуто с помощью чего-то подобного этому:
UNION
SELECT contact_person, 'N/A', 'N/A' FROM T1,T2
В реальном запросе мне (нужно) сделать много форматирования "contact_person" и "contactN", поэтому простое выполнение UNION (без ALL, поэтому равные записи исключаются) не сработает (contactN на самом деле значение для нескольких полей и форматирование не согласованы, поэтому записи, возвращаемые последним запросом, могут отличаться от записей выше даже для одной и той же записи в базе данных). Кроме того, запрос уже настолько огромен, что невозможно использовать противоположность первого запроса для исключения его записей, например:
UNION ALL
SELECT contact_person, 'N/A', 'N/A' FROM T1,T2
WHERE contact_person <> contact1
AND contact_person <> contact2
AND contact_person <> contact3
AND contact_person <> contact4
Так есть ли другой способ отобразить все записи, которые не были выбраны в самом первом запросе, опубликованном выше? Может быть, каким-то образом запустив подзапрос (ofc существует UID для возвращенных записей - я просто не знаю, как работать с ним в этом контексте)? Мог ли самый первый запрос быть написан более простым способом?