1

でポインティングがないtableA場合にのみ、行数を取得したいと思います。rowA_xFKrowB_xtableB

tableA:

id | id_tableB

tableB

id | ...

したがって、基本的に、の行は、のように列が存在しないtableA場合にのみカウントする必要があります。id_tableAidtableB

そのようなカウントを行うためのクリーンな方法はありますか?私は約500.000行あります。

4

3 に答える 3

1

いくつかあります(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はサブクエリよりも効率的です。

于 2012-10-05T10:03:44.550 に答える
0

これを行う最も効率的な方法は、サブクエリを使用することです。

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
;
于 2012-10-05T09:51:04.723 に答える
0

構造を使用することもできますWHERE NOT EXISTS()

あなたの質問をよく理解していれば、最終的なクエリは次のようになります。

SELECT COUNT(*)
FROM tableA
WHERE NOT EXISTS (SELECT id FROM tableB WHERE tableA.id = tableB.id_tableA)
于 2012-10-05T09:53:19.617 に答える