2

私はすでに次の問題に対する実用的な解決策を持っていますが、それがばかげているか非効率的ではないかと心配しています。

列のある表Thingと列の(id, attributes...)ある表があります。問題は、対応する行が 1 つだけ存在する場所から選択することです。ThingVersion(id, thing_id, version_attributes...)ThingThingVersion

現時点では、次のようなものがあります

SELECT Thing.id AS id, Foo.whatever
FROM Thing JOIN Foo ON Thing.id=Foo.thing_id
WHERE Thing.id IN (
    SELECT thing_id FROM ThingVersion TV
    WHERE 1 = (
        SELECT COUNT(*)
        FROM ThingVersion TV2
        WHERE TV2.thing_id = TV.thing_id)
    )
ORDER BY Foo.whatever

それは正しい結果を与えるようであり、強調された非教祖としては自明のように思えますが、- 3 つの選択?!?! -- もっと良い方法があるに違いないと感じずにはいられません。

ある?

4

3 に答える 3

1

厳密に JOIN を使用したソリューション:

SELECT t.*
FROM Thing t
JOIN ThingVersion tv1
  ON tv1.thing_id = t.id
LEFT JOIN ThingVersion tv2
  ON tv2.thing_id = t.id
  AND tv2.id <> tv1.id
WHERE tv2.id IS NULL

GROUP BY と COUNT を使用したソリューション:

SELECT t.* 
FROM Thing t
JOIN ThingVersion tv
  ON tv.thing_id = t.id
GROUP BY t.id
HAVING COUNT(t.id) = 1;

両方のパフォーマンスを試してみてください。

于 2012-02-24T18:49:22.460 に答える