Как я могу реализовать операции SQL INTERSECT и MINUS в MS Access - PullRequest
20 голосов
/ 03 декабря 2008

Я исследовал и не нашел способа запуска операций INTERSECT и MINUS в MS Access. Есть ли способ

Ответы [ 4 ]

30 голосов
/ 03 декабря 2008

INTERSECT - это внутреннее соединение. МИНУС - это внешнее соединение, где вы выбираете только записи, которых нет в другой таблице.


ПЕРЕСЕЧЕНИЕ
select distinct
  a.*
from
  a
  inner join b on a.id = b.id

МИНУС

select distinct
  a.*
from
  a
  left outer join b on a.id = b.id
where
  b.id is null

Если вы отредактируете свой исходный вопрос и опубликуете некоторые примеры данных, то вам может быть представлен пример.

РЕДАКТИРОВАТЬ: Забыли добавить в отличном от запросов.

14 голосов
/ 03 декабря 2008

INTERSECT не является внутренним соединением. Они разные. ВНУТРЕННЕЕ СОЕДИНЕНИЕ даст вам дубликаты строк в тех случаях, когда INTERSECT НЕ БУДЕТ. Вы можете получить эквивалентные результаты по:

SELECT DISTINCT a.*
FROM a
INNER JOIN b
   on a.PK = b.PK

Обратите внимание, что PK должен быть столбцом или столбцами первичного ключа. Если на столе нет PK (ПЛОХО!), Вы должны написать это так:

SELECT DISTINCT a.*
FROM a
INNER JOIN b
   ON  a.Col1 = b.Col1
   AND a.Col2 = b.Col2
   AND a.Col3 = b.Col3 ...

С MINUS вы можете сделать то же самое, но с LEFT JOIN и проверкой условия WHERE на null в одном из необнуляемых столбцов таблицы b (предпочтительно первичный ключ).

SELECT DISTINCT a.*
FROM a
LEFT JOIN b
   on a.PK = b.PK
WHERE b.PK IS NULL

Это должно сделать это.

3 голосов
/ 03 декабря 2008

Они сделаны через СОЕДИНЕНИЯ. По старинке:)

Для INTERSECT вы можете использовать INNER JOIN. Довольно просто. Просто нужно использовать GROUP BY или DISTINCT, если у вас нет чисто однозначных отношений. В противном случае, как уже упоминали другие, вы можете получить больше результатов, чем ожидаете.

Для MINUS вы можете использовать LEFT JOIN и использовать WHERE, чтобы ограничить его, чтобы вы получали только те строки из вашей основной таблицы, которые не соответствуют таблице LEFT JOINed.

Легкий горох.

0 голосов
/ 03 декабря 2008

К сожалению, MINUS не поддерживается в MS Access - одним из обходных путей может быть создание трех запросов, один с полным набором данных, один, который вытягивает строки, которые вы хотите отфильтровать, и третий, оставленный, соединяет две таблицы и только вытягивает записи, которые существуют только в вашем полном наборе данных.

То же самое относится и к INTERSECT, за исключением того, что вы делаете это через внутреннее соединение и возвращаете только записи, которые существуют в обоих.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...