でポインティングがないtableA
場合にのみ、行数を取得したいと思います。rowA_x
FK
rowB_x
tableB
tableA:
id | id_tableB
tableB
id | ...
したがって、基本的に、の行は、のように列が存在しないtableA
場合にのみカウントする必要があります。id_tableA
id
tableB
そのようなカウントを行うためのクリーンな方法はありますか?私は約500.000行あります。
いくつかあります(MySQL構文については100%確実ではないため、微調整が必要になる場合があります)。
NOT INで副選択:
select count(*) from tableA where id_tableB not in (select id from tableB);
NOT EXISTSでサブ選択:
select * from tableA a
where NOT EXISTS (select null from tableB b where a.id_tableB = b.id);
アウタージョイン:
select count(*) from (
select a.*, b.id as b_id
from tableA a
left join tableB b on a.id_tableB = b.id)
where b_id IS NULL;
これらのどれが最速かはデータによって異なりますが、通常、JOINはサブクエリよりも効率的です。
これを行う最も効率的な方法は、サブクエリを使用することです。
SELECT COUNT(*)
FROM tableA
WHERE id_tableB NOT IN (
SELECT id
FROM tableB
)
;
編集:LEFT OUTER JOIN
ただし、さらに検討すると、以下のクエリは、サブクエリではなく a を使用するため、実際にはより効率的である可能性があります。
SELECT COUNT(*)
FROM tableA A
LEFT OUTER JOIN tableB B
ON A.id_tableB= B.id
WHERE B.id IS NULL
;
構造を使用することもできますWHERE NOT EXISTS()
。
あなたの質問をよく理解していれば、最終的なクエリは次のようになります。
SELECT COUNT(*)
FROM tableA
WHERE NOT EXISTS (SELECT id FROM tableB WHERE tableA.id = tableB.id_tableA)