Ответы:
SELECT t1.name
FROM table1 t1
LEFT JOIN table2 t2 ON t2.name = t1.name
WHERE t2.name IS NULL
Q : что здесь происходит?
A : Концептуально, мы выбираем все строки table1
для каждой строки, в которой мы пытаемся найти строку table2
с одинаковым значением для name
столбца. Если такой строки нет, мы просто оставляем table2
часть нашего результата пустой для этой строки. Затем мы ограничиваем наш выбор, выбирая только те строки в результате, где соответствующая строка не существует. Наконец, мы игнорируем все поля из нашего результата, кроме name
столбца (который, как мы уверены, существует, из table1
).
Хотя это может быть не самый производительный метод, возможный во всех случаях, он должен работать практически в каждом механизме баз данных, когда-либо пытающихся реализовать ANSI 92 SQL
Вы можете сделать
SELECT name
FROM table2
WHERE name NOT IN
(SELECT name
FROM table1)
или
SELECT name
FROM table2
WHERE NOT EXISTS
(SELECT *
FROM table1
WHERE table1.name = table2.name)
Посмотрите этот вопрос для 3 методов для достижения этой цели
У меня недостаточно очков репутации, чтобы проголосовать за второй ответ. Но я должен не согласиться с комментариями на верхний ответ. Второй ответ:
SELECT name
FROM table2
WHERE name NOT IN
(SELECT name
FROM table1)
Является ли FAR более эффективным на практике. Я не знаю почему, но я работаю с 800k + записями, и разница огромна с преимуществом, полученным во втором ответе, опубликованном выше. Просто мои 0,02 доллара
Это чистая теория множеств, которой вы можете достичь с помощью minus
операции.
select id, name from table1
minus
select id, name from table2
SELECT <column_list>
FROM TABLEA a
LEFTJOIN TABLEB b
ON a.Key = b.Key
WHERE b.Key IS NULL;
https://www.cloudways.com/blog/how-to-join-two-tables-mysql/
Остерегайтесь ловушек. Если поле Name
в Table1
содержит NULLS вы в сюрпризы. Лучше это:
SELECT name
FROM table2
WHERE name NOT IN
(SELECT ISNULL(name ,'')
FROM table1)
Вот что сработало лучше для меня.
SELECT *
FROM @T1
EXCEPT
SELECT a.*
FROM @T1 a
JOIN @T2 b ON a.ID = b.ID
Это было более чем в два раза быстрее, чем любой другой метод, который я пробовал.
Вы можете использовать EXCEPT
в mssql или MINUS
в oracle, они идентичны согласно:
Это работа для меня
SELECT *
FROM [dbo].[table1] t1
LEFT JOIN [dbo].[table2] t2 ON t1.[t1_ID] = t2.[t2_ID]
WHERE t2.[t2_ID] IS NULL
Я собираюсь сделать репост (поскольку я еще не достаточно крутой, чтобы комментировать) в правильном ответе .... на тот случай, если кто-то еще подумает, что лучше объяснить.
SELECT temp_table_1.name
FROM original_table_1 temp_table_1
LEFT JOIN original_table_2 temp_table_2 ON temp_table_2.name = temp_table_1.name
WHERE temp_table_2.name IS NULL
И я видел синтаксис в FROM, нуждающийся в запятых между именами таблиц в mySQL, но в sqlLite казалось, что он предпочитает пробел.
Суть в том, что когда вы используете неверные имена переменных, это оставляет вопросы. Мои переменные должны иметь больше смысла. И кто-то должен объяснить, почему нам нужна запятая или нет запятой.
Если вы хотите выбрать конкретного пользователя
SELECT tent_nmr FROM Statio_Tentative_Mstr
WHERE tent_npk = '90009'
AND
tent_nmr NOT IN (SELECT permintaan_tent FROM Statio_Permintaan_Mstr)
tent_npk
Является первичным ключом пользователя