Подтвердить что ты не робот

Как я могу выполнять операции SQL INTERSECT и MINUS в MS Access

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

4b9b3361

Ответ 1

INTERSECT - это внутреннее соединение. MINUS - это внешнее соединение, в котором вы выбираете только записи, которые не существуют в другой таблице.


 <Б > 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

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

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

Ответ 2

INTERSECT НЕ ВХОДЯЩИЙ ПРИСОЕДИНЯЙТЕСЬ. Они разные. INNER JOIN предоставит вам повторяющиеся строки в случаях, когда INTERSECT WILL нет. Вы можете получить эквивалентные результаты:

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

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

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, не являющемся NULL-столбцом (предпочтительно первичный ключ).

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

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

Ответ 3

Они сделаны через JOINs. Старомодный способ:)

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

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

Легкий peasy.

Ответ 4

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

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

Ответ 5

Я считаю, что это делает МИНУС

SELECT DISTINCT
  a.CustomerID, 
  b.CustomerID
FROM 
  tblCustomers a
LEFT JOIN 
  [Copy Of tblCustomers] b
ON
  a.CustomerID = b.CustomerID
WHERE
  b.CustomerID IS NULL