SQL-соединение: как выбрать, когда значение не в наборе значений - PullRequest
4 голосов
/ 31 декабря 2010

У меня есть две таблицы, table1 и table2. Таблица1 находится в отношении один ко многим с таблицей2 (одна строка в таблице1 соответствует множеству строк в таблице2). В таблице 2 есть поле с именем code. Если ни одно из значений кода в таблице2 не равно некоторому набору значений (скажем, 1, 2 и 3), я хочу выбрать значение в таблице1. Я не уверен, как написать такой тип соединения.
Предположим, что первичный ключ в table1 называется id, а внешний ключ, с которым он связан, - сделал. Можете ли вы сказать мне, как написать этот тип соединения?

Ответы [ 3 ]

7 голосов
/ 31 декабря 2010

Это известно как antijoin .

Самая простая реализация:

SELECT * FROM table1
WHERE NOT EXISTS (SELECT 1 FROM table2
                  WHERE  table2.did = table1.id
                    AND  table2.code in (1,2,3))

или, используя внешнее соединение (я не уверен на 100%, что это будет работать, поскольку я всегда использую синтаксис NOT EXIST для антисоединений):

SELECT  table1.*
FROM    table1
LEFT OUTER JOIN
        table2
ON      table1.id = table2.did
  AND  table2.code in (1,2,3)
WHERE   table2.did is NULL
0 голосов
/ 31 декабря 2010

Ваш вопрос можно задать более четко. Необходимо уделить внимание как вашему естественному языку, так и вашему SQL. Возможно, я не понял ваш вопрос. Обратите внимание, что вы подразумеваете под «Если ни одно из значений кода в таблице2 не равно некоторому набору значений (скажем, 1, 2 и 3), я хочу выбрать значение в таблице1». Вы имеете в виду « строка в таблице 1»? И вместо "равно некоторому набору" вы имеете в виду "найден в каком-то наборе"?

Если у вас есть две таблицы в отношении один ко многим, например, Композиторы и Работы:

               COMPOSERS
               composerid
               composername
               DOB

              WORKS
              workid
              workname
              composerid
              datecomposed
              worktype  (e.g. sonata, string quartet, quintet, symphony)

и вы хотите найти все произведения композитора, которые не являются сонатами или квинтетами, вы должны сделать это:

            select composer.composername, works.workname, worktype
            from COMPOSERS inner join WORKS
            on COMPOSERS.composerid = WORKS.composerid
            WHERE worktype not IN ('sonata','quintet')

ЕСЛИ рабочий тип допускает пустые значения, вам нужно добавить «или рабочий тип равен нулю» к предложению where, если вы хотите, чтобы работы работали без введенного в запись рабочего типа.

0 голосов
/ 31 декабря 2010
SELECT * FROM table1 t1
LEFT JOIN table2 t2 ON t1.id = t2.did
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...