PostgreSQL เด†เดจเตเดฑเดฟเดชเดพเดฑเตเดฑเต‡เดฃเตเด•เตพ: "เด’เดฐเต†เดฃเตเดฃเด‚ เดฎเดพเดคเตเดฐเดฎเต‡ เด…เดตเดถเต‡เดทเดฟเด•เตเด•เตเดจเตเดจเตเดณเตเดณเต‚!"

SQL-เตฝ, เดจเดฟเด™เตเด™เตพ "เดŽเดจเตเดคเดพเดฃเต" เดจเต‡เดŸเดพเตป เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจเดคเต†เดจเตเดจเต เดตเดฟเดตเดฐเดฟเด•เตเด•เตเดจเตเดจเต, เด…เดคเต เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เต‡เดฃเตเดŸเดคเต "เดŽเด™เตเด™เดจเต†" เดŽเดจเตเดจเดฒเตเดฒ. เด…เดคเดฟเดจเดพเตฝ, "เด•เต‡เตพเด•เตเด•เตเดจเตเดจเดคเตเดชเต‹เดฒเต† เดŽเดดเตเดคเดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเตเดชเต‹เดฒเต†" เดŽเดจเตเดจ เดถเตˆเดฒเดฟเดฏเดฟเตฝ SQL เด…เดจเตเดตเต‡เดทเดฃเด™เตเด™เตพ เดตเดฟเด•เดธเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดฒเต† เดชเตเดฐเดถเตเดจเด‚ เด…เดคเดฟเดจเตเดฑเต† เดฌเดนเตเดฎเดคเดฟเดฏเตเดŸเต† เดธเตเดฅเดพเดจเดคเตเดคเต เดŽเดŸเตเด•เตเด•เตเดจเตเดจเต. SQL-เตฝ เดตเตเดฏเดตเดธเตเดฅเด•เตพ เด•เดฃเด•เตเด•เดพเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดธเดตเดฟเดถเต‡เดทเดคเด•เตพ.

เด‡เดจเตเดจเต, เดตเดณเดฐเต† เดฒเดณเดฟเดคเดฎเดพเดฏ เด‰เดฆเดพเดนเดฐเดฃเด™เตเด™เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต, เด‰เดชเดฏเต‹เด—เดคเตเดคเดฟเดจเตเดฑเต† เดชเดถเตเดšเดพเดคเตเดคเดฒเดคเตเดคเดฟเตฝ เด‡เดคเต เดŽเดจเตเดคเดฟเดฒเต‡เด•เตเด•เต เดจเดฏเดฟเด•เตเด•เตเดฎเต†เดจเตเดจเต เดจเต‹เด•เตเด•เดพเด‚ GROUP/DISTINCT ะธ LIMIT เด…เดตเดฐเต‹เดŸเตŠเดชเตเดชเด‚.

เด‡เดชเตเดชเต‹เตพ, เดจเดฟเด™เตเด™เตพ เด…เดญเตเดฏเตผเดคเตเดฅเดจเดฏเดฟเตฝ เดŽเดดเตเดคเดฟเดฏเต†เด™เตเด•เดฟเตฝ "เด†เดฆเตเดฏเด‚ เดˆ เด…เดŸเดฏเดพเดณเด™เตเด™เตพ เดฌเดจเตเดงเดฟเดชเตเดชเดฟเด•เตเด•เตเด•, เดคเตเดŸเตผเดจเตเดจเต เดŽเดฒเตเดฒเดพ เดคเดจเดฟเดชเตเดชเด•เตผเดชเตเดชเตเด•เดณเตเด‚ เดŽเดฑเดฟเดฏเตเด•, เด’เดฐเต†เดฃเตเดฃเด‚ เดฎเดพเดคเตเดฐเดฎเต‡ เดถเต‡เดทเดฟเด•เตเด•เดพเดตเต‚ เด“เดฐเต‹ เด•เต€เดฏเตเด•เตเด•เตเด‚ เดชเด•เตผเดคเตเดคเตเด•" - เด•เดฃเด•เตเดทเตป เด†เดตเดถเตเดฏเดฎเดฟเดฒเตเดฒเต†เด™เตเด•เดฟเดฒเตเด‚ เด‡เดคเต เด•เตƒเดคเตเดฏเดฎเดพเดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเด‚.

เดšเดฟเดฒเดชเตเดชเต‹เตพ เดจเดฟเด™เตเด™เตพ เดญเดพเด—เตเดฏเดตเดพเดจเดพเดฃเต, เด…เดคเต "เดตเต†เดฑเตเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเต", เดšเดฟเดฒเดชเตเดชเต‹เตพ เด‡เดคเต เดชเตเดฐเด•เดŸเดจเดคเตเดคเดฟเตฝ เด…เดธเตเด–เด•เดฐเดฎเดพเดฏ เดธเตเดตเดพเดงเต€เดจเด‚ เดšเต†เดฒเตเดคเตเดคเตเดจเตเดจเต, เดšเดฟเดฒเดชเตเดชเต‹เตพ เด‡เดคเต เดกเดตเดฒเดชเตเดชเดฑเตเดŸเต† เด•เดพเดดเตเดšเดชเตเดชเดพเดŸเดฟเตฝ เดจเดฟเดจเตเดจเต เดคเดฟเด•เดšเตเดšเตเด‚ เด…เดชเตเดฐเดคเต€เด•เตเดทเดฟเดคเดฎเดพเดฏ เด‡เดซเด•เตเดฑเตเดฑเตเด•เตพ เดจเตฝเด•เตเดจเตเดจเต.

PostgreSQL เด†เดจเตเดฑเดฟเดชเดพเดฑเตเดฑเต‡เดฃเตเด•เตพ: "เด’เดฐเต†เดฃเตเดฃเด‚ เดฎเดพเดคเตเดฐเดฎเต‡ เด…เดตเดถเต‡เดทเดฟเด•เตเด•เตเดจเตเดจเตเดณเตเดณเต‚!"
เดถเดฐเดฟ, เด’เดฐเตเดชเด•เตเดทเต‡ เด…เดคเตเดฐ เด—เด‚เดญเต€เดฐเดฎเดฒเตเดฒ, เดชเด•เตเดทเต‡ ...

"เดฎเดงเตเดฐ เดฆเดฎเตเดชเดคเดฟเด•เตพ": เดšเต‡เดฐเตเด• + เดกเดฟเดธเตเดฑเตเดฑเดฟเด™เตเด•เตเดฑเตเดฑเต

SELECT DISTINCT
  X.*
FROM
  X
JOIN
  Y
    ON Y.fk = X.pk
WHERE
  Y.bool_condition;

เด…เดตเตผเด•เตเด•เต เดŽเดจเตเดคเดพเดฃเต เดตเต‡เดฃเตเดŸเดคเต†เดจเตเดจเต เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด‚ เดชเต‚เตผเดคเตเดคเดฟเดฏเดพเด•เตเด•เดฟเดฏ เด…เดตเดธเตเดฅเดฏเตเดฎเดพเดฏเดฟ เดฌเดจเตเดงเดชเตเดชเต†เดŸเตเดŸ Y-เตฝ เดฑเต†เด•เตเด•เต‹เตผเดกเตเด•เตพ เด‰เดณเตเดณ X เดฑเต†เด•เตเด•เต‹เตผเดกเตเด•เตพ เดคเดฟเดฐเดžเตเดžเต†เดŸเตเด•เตเด•เตเด•. เดตเดดเดฟ เด’เดฐเต เด…เดชเต‡เด•เตเดท เดŽเดดเตเดคเดฟ JOIN - เด•เตเดฑเดšเตเดšเต pk เดฎเต‚เดฒเตเดฏเด™เตเด™เตพ เดชเดฒเดคเดตเดฃ เดฒเดญเดฟเดšเตเดšเต (เด•เตƒเดคเตเดฏเดฎเดพเดฏเดฟ เดŽเดคเตเดฐ เด…เดจเตเดฏเต‹เดœเตเดฏเดฎเดพเดฏ เดŽเตปเดŸเตเดฐเดฟเด•เตพ Y-เตฝ เดชเตเดฐเดคเตเดฏเด•เตเดทเดชเตเดชเต†เดŸเตเดŸเต). เดŽเด™เตเด™เดจเต† เดจเต€เด•เตเด•เด‚ เดšเต†เดฏเตเดฏเดพเด‚? เดคเต€เตผเดšเตเดšเดฏเดพเดฏเตเด‚ DISTINCT!

เด“เดฐเต‹ เดŽเด•เตโ€Œเดธเต-เดฑเต†เด•เตเด•เต‹เตผเดกเดฟเดจเตเด‚ เดจเต‚เดฑเตเด•เดฃเด•เตเด•เดฟเดจเต เดตเตˆ-เดฑเต†เด•เตเด•เต‹เตผเดกเตเด•เตพ เด‰เดณเตเดณเดชเตเดชเต‹เตพ เด‡เดคเต เดชเตเดฐเดคเตเดฏเต‡เด•เดฟเดšเตเดšเตเด‚ "เดธเดจเตเดคเต‹เดทเด•เดฐเดฎเดพเดฃเต", เดคเตเดŸเตผเดจเตเดจเต เดกเตเดฏเต‚เดชเตเดฒเดฟเด•เตเด•เต‡เดฑเตเดฑเตเด•เตพ เดตเต€เดฐเต‹เดšเดฟเดคเดฎเดพเดฏเดฟ เดจเต€เด•เตเด•เด‚ เดšเต†เดฏเตเดฏเดชเตเดชเต†เดŸเตเดจเตเดจเต ...

PostgreSQL เด†เดจเตเดฑเดฟเดชเดพเดฑเตเดฑเต‡เดฃเตเด•เตพ: "เด’เดฐเต†เดฃเตเดฃเด‚ เดฎเดพเดคเตเดฐเดฎเต‡ เด…เดตเดถเต‡เดทเดฟเด•เตเด•เตเดจเตเดจเตเดณเตเดณเต‚!"

เดŽเด™เตเด™เดจเต† เดถเดฐเดฟเดฏเดพเด•เตเด•เดพเด‚? เด†เดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต, เดชเตเดฐเดถเตเดจเด‚ เดฎเดพเดฑเตเดฑเดพเตป เด•เดดเดฟเดฏเตเดฎเต†เดจเตเดจเต เดฎเดจเดธเตเดธเดฟเดฒเดพเด•เตเด•เตเด• "เดจเดฟเดตเตผเดคเตเดคเดฟเดšเตเดš เด…เดตเดธเตเดฅเดฏเตเดฎเดพเดฏเดฟ Y-เตฝ เด•เตเดฑเดžเตเดžเดคเต เด’เดฐเต†เดฃเตเดฃเดฎเต†เด™เตเด•เดฟเดฒเตเด‚ เดฌเดจเตเดงเดชเตเดชเต†เดŸเตเดŸเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจ X เดฐเต‡เด–เด•เตพ เดคเดฟเดฐเดžเตเดžเต†เดŸเตเด•เตเด•เตเด•" - เดŽเดฒเตเดฒเดพเดคเตเดคเดฟเดจเตเดฎเตเดชเดฐเดฟ, Y- เดฑเต†เด•เตเด•เต‹เตผเดกเดฟเตฝ เดจเดฟเดจเตเดจเต เดคเดจเตเดจเต† เดžเด™เตเด™เตพเด•เตเด•เต เด’เดจเตเดจเตเด‚ เด†เดตเดถเตเดฏเดฎเดฟเดฒเตเดฒ.

เดจเต†เดธเตเดฑเตเดฑเดกเต EXISTS

SELECT
  *
FROM
  X
WHERE
  EXISTS(
    SELECT
      NULL
    FROM
      Y
    WHERE
      fk = X.pk AND
      bool_condition
    LIMIT 1
  );

PostgreSQL-เดจเตเดฑเต† เดšเดฟเดฒ เดชเดคเดฟเดชเตเดชเตเด•เตพ, EXISTS-เตฝ เดตเดฐเตเดจเตเดจ เด†เดฆเตเดฏ เดŽเตปเดŸเตเดฐเดฟ เด•เดฃเตเดŸเต†เดคเตเดคเดฟเดฏเดพเตฝ เดฎเดคเดฟเดฏเต†เดจเตเดจเตเด‚ เดชเดดเดฏเดต เด•เดฃเตเดŸเต†เดคเตเดคเตเดจเตเดจเดฟเดฒเตเดฒเต†เดจเตเดจเตเด‚ เดฎเดจเดธเตเดธเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเต. เด…เดคเตเด•เตŠเดฃเตเดŸเต เดŽเดชเตเดชเต‹เดดเตเด‚ เดธเต‚เดšเดฟเดชเตเดชเดฟเด•เตเด•เดพเตป เดžเดพเตป เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจเต LIMIT 1 เด…เด•เดคเตเดคเต EXISTS.

เดฒเดพเดฑเตเดฑเดฑเตฝ เดœเต‹เดฏเดฟเตป

SELECT
  X.*
FROM
  X
, LATERAL (
    SELECT
      Y.*
    FROM
      Y
    WHERE
      fk = X.pk AND
      bool_condition
    LIMIT 1
  ) Y
WHERE
  Y IS DISTINCT FROM NULL;

เด†เดตเดถเตเดฏเดฎเต†เด™เตเด•เดฟเตฝ, เด•เดฃเตเดŸเต†เดคเตเดคเดฟเดฏ เด…เดจเตเดฌเดจเตเดง Y-เดฐเต‡เด–เดฏเดฟเตฝ เดจเดฟเดจเตเดจเต เด•เตเดฑเดšเตเดšเต เดกเดพเดฑเตเดฑ เด‰เดŸเตป เดคเดฟเดฐเดฟเด•เต† เดจเตฝเด•เดพเตป เด‡เดคเต‡ เด“เดชเตเดทเตป เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต. เดธเดฎเดพเดจเดฎเดพเดฏ เด’เดฐเต เด“เดชเตเดทเตป เดฒเต‡เด–เดจเดคเตเดคเดฟเตฝ เดšเตผเดšเตเดšเดšเต†เดฏเตเดฏเตเดจเตเดจเต "PostgreSQL เด†เดจเตเดฑเดฟเดชเดพเดฑเตเดฑเต‡เดฃเตเด•เตพ: เด’เดฐเต เด…เดชเต‚เตผเดต เดฑเต†เด•เตเด•เต‹เตผเดกเต เด’เดฐเต เดœเต‹เดฏเดฟเตป เดฎเดงเตเดฏเดคเตเดคเดฟเตฝ เดŽเดคเตเดคเตเด‚".

"เดŽเดจเตเดคเตเด•เตŠเดฃเตเดŸเต เด•เต‚เดŸเตเดคเตฝ เดชเดฃเด‚ เดจเตฝเด•เดฃเด‚": DISTINCT [ON] + LIMIT 1

เด…เดคเตเดคเดฐเด‚ เด…เดจเตเดตเต‡เดทเดฃ เดชเดฐเดฟเดตเตผเดคเตเดคเดจเด™เตเด™เดณเตเดŸเต† เด’เดฐเต เด…เดงเดฟเด• เดจเต‡เดŸเตเดŸเด‚, เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เดธเดจเตเดฆเตผเดญเดคเตเดคเดฟเดฒเต†เดจเตเดจเดชเต‹เดฒเต†, เด…เดตเดฏเดฟเตฝ เด’เดจเตเดจเต‹ เด…เดคเดฟเดฒเดงเดฟเด•เดฎเต‹ เดฎเดพเดคเตเดฐเดฎเต‡ เด†เดตเดถเตเดฏเดฎเตเดณเตเดณเต‚เดตเต†เด™เตเด•เดฟเตฝ, เดฑเต†เด•เตเด•เต‹เตผเดกเตเด•เตพเด•เตเด•เดพเดฏเตเดณเตเดณ เดคเดฟเดฐเดฏเตฝ เดŽเดณเตเดชเตเดชเดคเตเดคเดฟเตฝ เดชเดฐเดฟเดฎเดฟเดคเดชเตเดชเต†เดŸเตเดคเตเดคเดพเดจเตเดณเตเดณ เด•เดดเดฟเดตเดพเดฃเต:

SELECT DISTINCT ON(X.pk)
  *
FROM
  X
JOIN
  Y
    ON Y.fk = X.pk
LIMIT 1;

เด‡เดชเตเดชเต‹เตพ เดžเด™เตเด™เตพ เด…เดญเตเดฏเตผเดคเตเดฅเดจ เดตเดพเดฏเดฟเดšเตเดšเต DBMS เดŽเดจเตเดคเดพเดฃเต เดšเต†เดฏเตเดฏเดพเตป เดจเดฟเตผเดฆเตเดฆเต‡เดถเดฟเด•เตเด•เตเดจเตเดจเดคเต†เดจเตเดจเต เดฎเดจเดธเดฟเดฒเดพเด•เตเด•เดพเตป เดถเตเดฐเดฎเดฟเด•เตเด•เตเด•:

  • เด…เดŸเดฏเดพเดณเด™เตเด™เตพ เดฌเดจเตเดงเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเต
  • X.pk เดฎเตเด–เต‡เดจ เด…เดคเตเดฒเตเดฏเดฎเดพเดฏ
  • เดถเต‡เดทเดฟเด•เตเด•เตเดจเตเดจ เดŽเตปเดŸเตเดฐเดฟเด•เดณเดฟเตฝ เดจเดฟเดจเตเดจเต เด’เดจเตเดจเต เดคเดฟเดฐเดžเตเดžเต†เดŸเตเด•เตเด•เตเด•

เด…เดชเตเดชเต‹เตพ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดŽเดจเตเดคเดพเดฃเต เดฒเดญเดฟเดšเตเดšเดคเต? "เด’เดฐเต เดชเตเดฐเดตเต‡เดถเดจเด‚ เดฎเดพเดคเตเดฐเด‚" เด…เดคเตเดฒเตเดฏเดฎเดพเดฏเดตเดฏเดฟเตฝ เดจเดฟเดจเตเดจเต - เด…เดฆเตเดตเดฟเดคเต€เดฏเดฎเดฒเตเดฒเดพเดคเตเดคเดตเดฏเดฟเตฝ เด‡เดคเต เดŽเดŸเตเดคเตเดคเดพเตฝ, เดซเดฒเด‚ เดŽเด™เตเด™เดจเต†เดฏเต†เด™เตเด•เดฟเดฒเตเด‚ เดฎเดพเดฑเตเดฎเต‹?.. "เดชเดฟเดจเตเดจเต† เดตเตเดฏเดคเตเดฏเดพเดธเดฎเดฟเดฒเตเดฒเต†เด™เตเด•เดฟเตฝ, เดŽเดจเตเดคเดฟเดจเต เด•เต‚เดŸเตเดคเตฝ เดชเดฃเด‚ เดจเตฝเด•เดฃเด‚?"

SELECT
  *
FROM
  (
    SELECT
      *
    FROM
      X
    -- ััŽะดะฐ ะผะพะถะฝะพ ะฟะพะดััƒะฝัƒั‚ัŒ ะฟะพะดั…ะพะดัั‰ะธั… ัƒัะปะพะฒะธะน
    LIMIT 1 -- +1 Limit
  ) X
JOIN
  Y
    ON Y.fk = X.pk
LIMIT 1;

เด’เดชเตเดชเด‚ เด•เตƒเดคเตเดฏเดฎเดพเดฏเดฟ เด…เดคเต‡ เดตเดฟเดทเดฏเด‚ GROUP BY + LIMIT 1.

"เดŽเดจเดฟเด•เตเด•เต เดšเต‹เดฆเดฟเด•เตเด•เดพเดจเตเดฃเตเดŸเต": เดชเดฐเต‹เด•เตเดทเดฎเดพเดฏ GROUP + LIMIT

เดธเดฎเดพเดจเดฎเดพเดฏ เด•เดพเดฐเตเดฏเด™เตเด™เตพ เดตเตเดฏเดคเตเดฏเดธเตเดค เดธเตเดฅเดฒเด™เตเด™เดณเดฟเตฝ เดธเด‚เดญเดตเดฟเด•เตเด•เตเดจเตเดจเต เดถเต‚เดจเตเดฏเดคเดฏเดฟเดฒเตเดฒเดพเดคเตเดค เดชเดฐเดฟเดถเต‹เดงเดจเด•เตพ เด…เดญเตเดฏเตผเดคเตเดฅเดจ เดชเตเดฐเต‹เด—เดฎเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ เด…เดŸเดฏเดพเดณเด™เตเด™เตพ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ CTEเด•เตพ:

...
CASE
  WHEN (
    SELECT
      count(*)
    FROM
      X
    LIMIT 1
  ) = 0 THEN ...

เดฎเตŠเดคเตเดคเดคเตเดคเดฟเดฒเตเดณเตเดณ เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เตพ (count/min/max/sum/...) เดตเตเดฏเด•เตเดคเดฎเดพเดฏ เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เตพ เด‡เดฒเตเดฒเดพเดคเต† เดชเต‹เดฒเตเด‚, เดฎเตเดดเตเดตเตป เดธเต†เดฑเตเดฑเดฟเดฒเตเด‚ เดตเดฟเดœเดฏเด•เดฐเดฎเดพเดฏเดฟ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเต GROUP BY. เด•เต‚เดŸเต† เดฎเดพเดคเตเดฐเด‚ LIMIT เด…เดตเตผ เดตเดณเดฐเต† เดธเต—เดนเตƒเดฆเดชเดฐเดฎเดฒเตเดฒ.

เดกเต†เดตเดฒเดชเตเดชเตผเด•เตเด•เต เดšเดฟเดจเตเดคเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚ "เด…เดตเดฟเดŸเต† เดฑเต†เด•เตเด•เต‹เตผเดกเตเด•เตพ เด‰เดฃเตเดŸเต†เด™เตเด•เดฟเตฝ, เดŽเดจเดฟเด•เตเด•เต เดชเดฐเดฟเดงเดฟเดฏเดฟเตฝ เด•เต‚เดŸเตเดคเตฝ เด†เดตเดถเตเดฏเดฎเดฟเดฒเตเดฒ". เดŽเดจเตเดจเดพเตฝ เด…เดคเต เดšเต†เดฏเตเดฏเดฐเตเดคเต! เด•เดพเดฐเดฃเด‚ เด…เดŸเดฟเดธเตเดฅเดพเดจเดคเตเดคเดฟเดจเต เด‡เดคเต:

  • เด…เดตเตผเด•เตเด•เดพเดตเดถเตเดฏเดฎเตเดณเตเดณเดคเต เดŽเดฃเตเดฃเตเด• เดŽเดฒเตเดฒเดพ เดฐเต‡เด–เด•เดณเตเด‚ เด…เดจเตเดธเดฐเดฟเดšเตเดšเต
  • เด…เดตเตผ เดšเต‹เดฆเดฟเด•เตเด•เตเดจเตเดจเดคเตเดฐ เดตเดฐเดฟเด•เตพ เดจเตฝเด•เตเด•

เดŸเดพเตผเด—เต†เดฑเตเดฑเต เดตเตเดฏเดตเดธเตเดฅเด•เดณเต† เด†เดถเตเดฐเดฏเดฟเดšเตเดšเต, เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจเดตเดฏเดฟเตฝ เด’เดจเตเดจเต เดชเด•เดฐเด‚ เดตเดฏเตเด•เตเด•เตเดจเตเดจเดคเต เด‰เดšเดฟเดคเดฎเดพเดฃเต:

  • (count + LIMIT 1) = 0 เด“เตบ NOT EXISTS(LIMIT 1)
  • (count + LIMIT 1) > 0 เด“เตบ EXISTS(LIMIT 1)
  • count >= N เด“เตบ (SELECT count(*) FROM (... LIMIT N))

"เด—เตเดฐเดพเดฎเดฟเตฝ เดŽเดคเตเดฐ เดคเต‚เด•เตเด•เดฃเด‚": DISTINCT + LIMIT

SELECT DISTINCT
  pk
FROM
  X
LIMIT $1

เด…เดญเตเดฏเตผเดคเตเดฅเดจ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเดคเต เดจเดฟเตผเดคเตเดคเตเดฎเต†เดจเตเดจเต เดจเดฟเดทเตเด•เดณเด™เตเด•เดจเดพเดฏ เด’เดฐเต เดกเต†เดตเดฒเดชเตเดชเตผ เด†เดคเตเดฎเดพเตผเดคเตเดฅเดฎเดพเดฏเดฟ เดตเดฟเดถเตเดตเดธเดฟเดšเตเดšเต‡เด•เตเด•เดพเด‚. เด†เดฆเตเดฏเด‚ เดตเดฐเตเดจเตเดจ เดตเตเดฏเดคเตเดฏเดธเตเดค เดฎเต‚เดฒเตเดฏเด™เตเด™เดณเดฟเตฝ เดจเดฟเดจเตเดจเต $1 เด•เดฃเตเดŸเต†เดคเตเดคเตเดฎเตเดชเต‹เตพ เดคเดจเตเดจเต†.

เดญเดพเดตเดฟเดฏเดฟเตฝ เดšเดฟเดฒเดชเตเดชเต‹เตพ เด‡เดคเต เด’เดฐเต เดชเตเดคเดฟเดฏ เดจเต‹เดกเดฟเดจเต เดจเดจเตเดฆเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเด‚ เดธเต‚เดšเดฟเด• เด’เดดเดฟเดตเดพเด•เตเด•เตฝ เดธเตเด•เดพเตป, เด‡เดคเต เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเดคเต เดจเดฟเดฒเดตเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเตเดฃเตเดŸเต, เดชเด•เตเดทเต‡ เด‡เดคเตเดตเดฐเต† เด†เดฏเดฟเดŸเตเดŸเดฟเดฒเตเดฒ.

เด‡เดชเตเดชเต‹เตพ เด†เดฆเตเดฏเด‚ เดŽเดฒเตเดฒเดพ เดฐเต‡เด–เด•เดณเตเด‚ เดตเต€เดฃเตเดŸเต†เดŸเตเด•เตเด•เตเด‚, เด…เดฆเตเดตเดฟเดคเต€เดฏเดฎเดพเดฃเต, เด…เดตเดฐเดฟเตฝ เดจเดฟเดจเตเดจเต เดฎเดพเดคเตเดฐเดฎเต‡ เด†เดตเดถเตเดฏเดชเตเดชเต†เดŸเตเดŸ เดคเตเด• เดคเดฟเดฐเดฟเด•เต† เดฒเดญเดฟเด•เตเด•เต‚. เดžเด™เตเด™เตพเด•เตเด•เต เด…เด™เตเด™เดจเต† เดŽเดจเตเดคเต†เด™เตเด•เดฟเดฒเตเด‚ เดตเต‡เดฃเดฎเต†เด™เตเด•เดฟเตฝ เด…เดคเต เดชเตเดฐเดคเตเดฏเต‡เด•เดฟเดšเตเดšเต เดธเด™เตเด•เดŸเด•เดฐเดฎเดพเดฃเต $ 1 = 4, เด•เต‚เดŸเดพเดคเต† เดชเดŸเตเดŸเดฟเด•เดฏเดฟเตฝ เดฒเด•เตเดทเด•เตเด•เดฃเด•เตเด•เดฟเดจเต เดฑเต†เด•เตเด•เต‹เตผเดกเตเด•เตพ เด‰เดฃเตเดŸเต...

เดตเต†เดฑเตเดคเต† เดธเด™เตเด•เดŸเดชเตเดชเต†เดŸเดพเดคเดฟเดฐเดฟเด•เตเด•เดพเตป, เดจเดฎเตเด•เตเด•เต เด’เดฐเต เด†เดตเตผเดคเตเดคเดจ เด…เดจเตเดตเต‡เดทเดฃเด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเด‚ PostgreSQL เดตเดฟเด•เตเด•เดฟเดฏเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ "DISTINCT เดฆเดฐเดฟเดฆเตเดฐเตผเด•เตเด•เตเดณเตเดณเดคเดพเดฃเต":

PostgreSQL เด†เดจเตเดฑเดฟเดชเดพเดฑเตเดฑเต‡เดฃเตเด•เตพ: "เด’เดฐเต†เดฃเตเดฃเด‚ เดฎเดพเดคเตเดฐเดฎเต‡ เด…เดตเดถเต‡เดทเดฟเด•เตเด•เตเดจเตเดจเตเดณเตเดณเต‚!"

เด…เดตเดฒเด‚เดฌเด‚: www.habr.com

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•