2013-10-10 5 views
3

У меня есть две таблицы, table1 и table2. Table2 содержит FK от table1. В настоящее время у моего table2 есть FK, которых больше нет в table1. Я хотел бы удалить эти записи из table2, где FK не существует в table1. Что такое SQL для этого?Как получить результаты из одной таблицы, где ID из другой таблицы нет в одной таблице

Вот "NOT IN" Я пробовал:

SELECT ATTORNEYS.ATTY_ID, ATTNY_PRACTICE_GROUPS.ATTY_ID, ATTNY_PRACTICE_GROUPS.ID, ATTNY_PRACTICE_GROUPS.PRACTICE_GRP_ID 
FROM ATTORNEYS INNER JOIN ATTNY_PRACTICE_GROUPS ON ATTORNEYS.[ATTY_ID] = ATTNY_PRACTICE_GROUPS.[ATTY_ID] 
WHERE ATTNY_PRACTICE_GROUPS.[ATTY_ID] NOT IN ATTORNEYS.ATTY_ID 

я, вероятно, не знаю, как использовать "NOT IN", потому что ошибка в операторе без() в выражении.

Я пробовал использовать !=, <>, NOT IN и IS NULL и пока не повезло. Цените любую помощь.

+0

Пожалуйста, покажите нам SQL из вашего 'НЕ в' попытки и объяснить, как это не удалось ... включить полный текст сообщения об ошибке. – HansUp

+0

См. Мое редактирование @HansUp – Joseph

+0

Мне, вероятно, не нужно использовать операторы NOT IN, это было то, что я пытался. – Joseph

ответ

2
SELECT ID 
FROM ATTNY_PRACTICE_GROUPS G 
WHERE NOT EXISTS (SELECT 1 FROM ATTORNEYS WHERE ATTY_ID = G.ATTY_ID) 

Этот запрос будет найти Attny_practice_group строки, которые имеют ATTY_ID, что не в ПОВЕРЕННЫХ.

+0

NOT IN также будет работать, но вам нужно делать WHERE G.ATTY_ID NOT IN (SELECT ATTY_ID FROM ATTORNEYS). NOT IN в этом случае, вероятно, менее эффективен, чем NOT EXISTS. – Aushin

+0

LEFT JOIN в примере randcd также будет отвечать вашим потребностям. – Aushin

+0

Это сработало. Для чего «1»? – Joseph

0

Что вам нужно, это ЛЕВЫЙ ВСТУПЛЕНИЕ. Ваш INNER JOIN предоставляет вам только те записи, которые вы хотите сохранить. Ваш оператор NOT IN не вернет никаких результатов. Меняйте INNER JOIN в LEFT JOIN и выбрать, где ATTNY_PRACTICE_GROUPS [SomeColumn] IS NULL

так, как это:.

SELECT ATTORNEYS.ATTY_ID, ATTNY_PRACTICE_GROUPS.ATTY_ID, ATTNY_PRACTICE_GROUPS.ID, ATTNY_PRACTICE_GROUPS.PRACTICE_GRP_ID 
FROM ATTORNEYS LEFT JOIN ATTNY_PRACTICE_GROUPS ON ATTORNEYS.[ATTY_ID] = ATTNY_PRACTICE_GROUPS.[ATTY_ID] 
WHERE ATTNY_PRACTICE_GROUPS.[ATTY_ID] IS NULL 

Или, возможно, я прочитал это неправильно. Если вы ищете Practice групп, которые имеют ATTY_ID, который не существует в таблице поверенных, это было бы так:

SELECT ATTNY_PRACTICE_GROUPS.ID, ATTNY_PRACTICE_GROUPS.PRACTICE_GRP_ID, ATTORNEYS.ATTY_ID 
FROM ATTNY_PRACTICE_GROUPS LEFT JOIN ATTORNEYS ON ATTORNEYS.[ATTY_ID] = ATTNY_PRACTICE_GROUPS.[ATTY_ID] 
WHERE ATTORNEYS.[ATTY_ID] IS NULL 
+0

IS NULL действительно не работает, потому что в поле есть значения.Я искал те, которые существуют в таблице ATTNY_PRACTICE_GROUPS, которых не было в ATTORNEYS. Аушин смог позаботиться обо мне. – Joseph

+2

В LEFT JOIN значение таблицы «RIGHT» будет NULL без соответствия. – randcd

+0

А, понял. Благодарю. – Joseph

Смежные вопросы