2016-04-30 3 views
0

У меня есть небольшая проблема с SQL-запросом: у меня есть «TableA» с полем «TableA.b», которое содержит ID для «TableB». Я хочу выбрать все строки из «TableB», которые не имеют идентификатора, равного любому полю «TableA.b». Другими словами, мне нужна каждая строка из TableB, на которую не ссылается ни одна строка из TableA в поле. Я попробовал запрос следующим образом:MySQL - выбор строк, где поля не равны

SELECT DISTINCT TableB.* FROM TableA, TableB Where TableA.b != TableB.ID 

Но результат содержит строку, которая также возвращается в отрицании, то есть, где оба поля имеют одинаковое значение. Любые идеи?

+0

Помог ли вам любой из представленных ответов? – e4c5

ответ

1

Что вам нужно, это LEFT (or RIGHT) JOIN.

SELECT TableB.* FROM TableA 
    LEFT JOIN TableB on TableA.b = TableB.ID 
    WHERE TableA.b IS NULL 

В то же время можно сделать то же самое с подзапросом, как в некоторых других ответах. Присоединение часто будет faster.

A Левая [OUTER] JOIN может быть быстрее, чем эквивалентный подзапрос, поскольку сервер может быть в состоянии оптимизировать это лучше-факт, что не специфичны для сервера MySQL в одиночку. До SQL-92 внешние соединения не существовали , поэтому подзапросы были единственным способом сделать определенные вещи. Сегодня, MySQL Server и многие другие современные системы баз данных предлагают широкий диапазон внешних типов соединений .

0

Вы можете попробовать это

SELECT TableB.* FROM TableB 
    WHERE ID NOT IN 
     (SELECT b from TableA); 
0

Во-первых, выберите все идентификаторы из TableA:

SELECT DISTINCT b FROM TableA 

Затем с помощью этого результата, чтобы выбрать все строки в TableB, которые имеют идентификатор, который не существует в этом наборе, используя указанный выше запрос в качестве подзапроса:

SELECT * FROM TableB WHERE ID NOT IN (SELECT DISTINCT b FROM TableA) 

Надеюсь, это поможет.

0

Использовать NOT IN в запросе SELECT.

SELECT * FROM TableB t1 WHERE t1.ID NOT IN (SELECT t2.b FROM TableA t2); 
+0

Это может быть решение, но похоже, что я получаю пустой результат, если результат внутреннего выбора содержит NULL. – user1563232

+0

'@ пользователь1563232' это невозможно. Внутренний Выберите либо «Пустое», либо «Количество строк». NULL невозможен в приведенном выше запросе. – Vijay

+0

, если вам нужны данные таблицыB, чем нет необходимости делать внутреннее или левое соединение с таблицей. – Vijay

0

Вы также можете использовать правое соединение. Попробуйте следующее:

SELECT DISTINCT TableB.* FROM tablea RIGHT JOIN TableB ON TableA.b = Tableb.ID WHERE TableA.B IS NULL 
Смежные вопросы