Привет, так что этот вопрос задавался раньше, но я не только пытаюсь извлечь записи, которые не просто существуют в первой таблице, но и сопоставление из первой таблицы, где их нет?
Например.
Предполагая, что я присоединюсь, используя Месяц и Год--
Таблица 1:
Месяц | Год |
---|---|
3 | 2021 |
4 | 2021 |
5 | 2021 |
6 | 2023 |
Таблица 2:
Я БЫ | Месяц | Год |
---|---|---|
11 | 3 | 2021 |
22 | 4 | 2021 |
33 | 5 | 2021 |
Выход:
Я БЫ | Месяц | Год |
---|---|---|
11 | 6 | 2023 |
22 | 6 | 2023 |
33 | 6 | 2023 |
Вам рекомендуется пометить единственную СУБД, которую вы используете, например. если MySQL, то пометьте его. Просто не помечайте конфликтующие СУБД.
Select
t2.ID "ID",
no_match.MONTH "MONTH",
no_match.YEAR "YEAR"
From
Table2 t2
Inner Join
( Select t1.MONTH "MONTH", t1.YEAR "YEAR" From Table1 t1 Left Join Table2 t2 ON(t1.MONTH = t2.MONTH And t1.YEAR = t2.YEAR) Where t2.YEAR Is Null ) no_match ON(1=1)
Where
t2.YEAR || t2.MONTH <> no_match.YEAR || no_match.MONTH
Ваш ответ может быть улучшен с помощью дополнительной вспомогательной информации. Пожалуйста, редактировать, чтобы добавить дополнительную информацию, например цитаты или документацию, чтобы другие могли подтвердить правильность вашего ответа. Дополнительную информацию о том, как писать хорошие ответы, можно найти в справочном центре.
Внутренний объединенный подзапрос с именем «no_match» выбирает записи из таблицы 1, которых нет в таблице 2. Теперь, когда они у нас есть, мы можем получить все идентификаторы из таблицы 2 рядом с соответствующей записью (записями) «no_match».
Из того, что вы говорите и показываете, вы хотите перекрестно соединить все строки таблицы 2 со строками таблицы 1, которые не имеют соответствия в таблице 2. Для поиска вы можете использовать NOT EXISTS
.
select t2.id, t1.month, t1.year
from t1 cross join t2
where not exists
(
select null
from t2
where t2.year = t1.year and t2.month = t1.month
);
@DaleK сделал с 1 и 3. Для 2 я пробовал все другие решения, приведенные в StackOverflow, но, похоже, не могу понять дополнительное требование.