Відповіді:
SELECT t1.name
FROM table1 t1
LEFT JOIN table2 t2 ON t2.name = t1.name
WHERE t2.name IS NULL
З : Що тут відбувається?
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)
Дивіться це запитання щодо трьох методів для цього
У мене не вистачає балів повторень, щоб проголосувати другу відповідь. Але я повинен не погодитися з коментарями до верхньої відповіді. Друга відповідь:
SELECT name
FROM table2
WHERE name NOT IN
(SELECT name
FROM table1)
Чи є ЗПД більш ефективним на практиці. Я не знаю чому, але я запускаю це проти 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
І я бачив синтаксис ВІД, коли потрібні коми між іменами таблиць у 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
первинний ключ користувача