web-dev-qa-db-ja.com

MS AccessでSQL INTERSECTおよびMINUS操作を実装するにはどうすればよいですか

MS AccessでINTERSECTおよびMINUS操作を実行する方法を調査しましたが、見つかりませんでした。何か方法はありますか

21
Varun Mahajan

INTERSECTは内部結合です。 MINUSは外部結合であり、他のテーブルに存在しないレコードのみを選択します。


交差する
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

元の質問を編集してサンプルデータを投稿すると、例を示すことができます。

編集:クエリに個別を追加するのを忘れました。

31
LeppyR64

INTERSECTは内部結合ではありません。彼らは違います。 INNER JOINは、INTERSECTができない場合に重複行を提供します。同等の結果を得るには、次のようにします。

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条件を使用して、テーブルbのnullを許容しない列の1つ(できれば主キー)でnullをチェックします。

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

それでうまくいくはずです。

14
Dave Markle

これらはJOINを通じて行われます。昔ながらの方法:)

INTERSECTには、INNER JOINを使用できます。かなり簡単です。純粋な1対1の関係が続いていない場合は、GROUP BYまたはDISTINCTを使用する必要があります。そうでなければ、他の人が述べたように、あなたはあなたが期待するよりも多くの結果を得ることができます。

MINUSの場合、LEFT JOINを使用し、WHEREを使用して制限することができるため、LEFT JOINされたテーブルと一致しないメインテーブルの行のみが返されます。

かんたん。

3
Kevin Fairchild

残念ながらMINUSはMS Accessではサポートされていません-1つの回避策は、3つのクエリを作成することです。完全なデータセットに存在します。

同じことがINTERSECTにも当てはまりますが、内部結合を介してそれを行い、両方に存在するレコードのみを返す場合があります。

0