0

2つのテーブルがあると想像してください。

テーブルバー:

+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| name  | varchar(255) | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+

テーブルfoo:

+------------------+--------------+------+-----+---------+-------+
| Field            | Type         | Null | Key | Default | Extra |
+------------------+--------------+------+-----+---------+-------+
| name_alternative | varchar(255) | YES  |     | NULL    |       |
+------------------+--------------+------+-----+---------+-------+

そして、テーブルのフィールドbarと同じ値を持つ行をテーブルから削除したいnamename_alternativefoo

次のクエリを使用できます。

DELETE FROM foo WHERE name IN (SELECT name_alternative FROM bar);

ただし、両方のテーブルに大量のレコードがある場合、実行には非常に長い時間がかかります。

ですから、このクエリに代わるより良い方法があるかどうか疑問に思いました。

4

3 に答える 3

1

これはうまくいく別の方法であり、私はそれがより効率的だと思います:

DELETE FROM bar
    USING foo, bar
    WHERE name_alternative = name

これが実用的なSQLFiddleの例です。

削除については、ドキュメントを参照してください

于 2013-02-28T11:23:49.500 に答える
1

@ dan1 {4}の答えに加えて、にインデックスがないため、長い時間がかかると思いますbar(name)

文字列によっては、255文字全体をカバーするインデックスは必要ありません。つまり、最初の文字が多くの行で異なる場合は、いくつかの文字にインデックスを作成します。

CREATE INDEX indexname ON bar(name(8))

8は、洗練したい推奨値です。インデックスは、mysqlがfoo.namealternativeに一致する各バー行を見つけるのに役立ちます

于 2013-02-28T11:31:23.307 に答える
0
delete from bar
using (
    select foo.name_alternative
    from 
        bar
        inner join
        foo on bar.name = foo.name_alternative
) s
where bar.name = s.name_alternative
于 2013-02-28T11:30:24.753 に答える