Вы можете использовать lookaround.
/^abc(?!.*abc).*123.*(?<!xyz.*)xyz$/g
(я его не тестировал.)
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 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 он, казалось, предпочитал пространство.
Суть в том, что вы используете неправильные имена переменных, которые оставляют вопросы. Мои переменные должны иметь больше смысла. И кто-то должен объяснить, почему нам нужна запятая или нет запятой.
Следите за ловушками. Если поле 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, они идентичны в соответствии с:
У меня нет достаточного количества очков для голосования по 2-му ответу. Но я должен не согласиться с комментариями на верхний ответ. Второй ответ:
SELECT name
FROM table2
WHERE name NOT IN
(SELECT name
FROM table1)
На практике FAR эффективнее. Я не знаю, почему, но я запускаю его с записями 800k +, и разница огромна с преимуществом, предоставленным второму ответу, опубликованному выше. Только мои $ 0,02
Это работает для меня
SELECT *
FROM [dbo].[table1] t1
LEFT JOIN [dbo].[table2] t2 ON t1.[t1_ID] = t2.[t2_ID]
WHERE t2.[t2_ID] IS NULL
Вы можете либо сделать
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)
См. этот вопрос для трех методов для выполнения этого
Это чистая теория множеств, которую вы можете достичь с помощью операции minus
.
select id, name from table1
minus
select id, name from table2