2 つのテーブルがあり、それぞれに次のフィールドがあります: IDnumber
、SectionNumber
、Date
。2 つの表には重複する情報があります。
オーバーラップしていない行のみを選択するにはどうすればよいですか (つまり、1 つのテーブルではなく、他のテーブルでは)。
2 つのテーブルがあり、それぞれに次のフィールドがあります: IDnumber
、SectionNumber
、Date
。2 つの表には重複する情報があります。
オーバーラップしていない行のみを選択するにはどうすればよいですか (つまり、1 つのテーブルではなく、他のテーブルでは)。
どの DBMS ですか?
SQL Serverなら、タイトルに書いた通りのものがほとんど...
SELECT *
FROM Table1
WHERE IDnumber NOT IN (SELECT IDnumber FROM Table2)
節でa を使用できNOT IN
ます。WHERE
SELECT IDnumber, SectionNumber, Date
FROM table1
WHERE IDnumber NOT IN (SELECT IDnumber FROM table2)
またNOT EXISTS
SELECT IDnumber, SectionNumber, Date
FROM table1 t1
WHERE NOT EXISTS (SELECT IDnumber FROM table2 t2 WHERE t1.IDnumber = t2.IDnumber)
複数の列を比較する場合は、外部結合が必要です。
select table1.*
from table1 left outer join
table2
on table1.id = table2.id and
table1.SectionNumber = table2.SectionNumber and
table1.date = table2.date
where table2.id is null
テーブル間に多くの一致がある場合、結合は非効率になる可能性があります。これら 3 つのフィールドのみが必要であると仮定すると、結合を回避するトリックを使用できます。
select id, SectionNumber, date
from ((select 0 as IsTable2, id, SectionNumber, date
from table1
) union all
(select 1 as IsTable2, id, SectionNumber, date
from table2
)
) t
group by id, SectionNumber, date
having max(isTable2) = 0
SELECT *
FROM Table1 t1 left join Table2 t2
on t1.id=t2.id
where t2.id is null