AND (wp_posts.post_type='attachment')
ここでの本当の問題は、 wp_posts を参照している唯一の場所が EXISTS および SET サブクエリにあることだと思います。WHERE 句のその部分 (上記で引用) は、サブクエリの範囲外にあり、それについて認識していません。
EXISTS サブクエリを次のようにするつもりでない限り:
(select 1
from wp_posts
join articles on wp_posts.post_name=articles.image
WHERE wp_posts.post_type='attachment')
この場合、wp_posts は同じ括弧のセットで参照されており、構文的に正しいです。これはおそらくあなたが求めているものを与えないので、代わりにこれを試してください:
UPDATE wp_postmeta
INNER JOIN wp_posts ON wp_posts.id = wp_postmeta.post_id
SET meta_value = (SELECT DISTINCT id FROM wp_posts WHERE [some condition])
WHERE EXISTS (select 1
from wp_posts
join articles on wp_posts.post_name=articles.image)
AND (wp_posts.post_type='attachment')
AND (wp_postmeta.meta_key='_thumbnail_id' )
注 #1: wp_postmeta テーブルには、wp_posts の id に対応する post_id フィールドがあると想定しています。
注#2:OMG Poniesが述べたように...
SET meta_value = (SELECT DISTINCT id FROM wp_posts)
この行は、1 しか期待されていない複数の値を返すため、ほとんどの場合エラーをスローします。上記で「WHERE [何らかの条件]」を追加したことに注意してください。ここに独自の WHERE 句を追加する必要があります。また、サブクエリの結果を 1 つだけに制限するものにする必要があります。