PostgreSQL เจเจ‚เจŸเฉ€เจชเฉˆเจŸเจฐเจจ: "เจธเจฟเจฐเจซเจผ เจ‡เฉฑเจ• เจนเฉ€ เจนเฉ‹เจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ!"

SQL เจตเจฟเฉฑเจš, เจคเฉเจธเฉ€เจ‚ เจตเจฐเจฃเจจ เจ•เจฐเจฆเฉ‡ เจนเฉ‹ เจ•เจฟ เจคเฉเจธเฉ€เจ‚ "เจ•เฉ€" เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจเจพ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจนเฉ‹, เจจเจพ เจ•เจฟ "เจ•เจฟเจตเฉ‡เจ‚" เจ‡เจน เจ•เฉ€เจคเจพ เจœเจพเจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆเฅค เจ‡เจธ เจฒเจˆ, "เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจ‡เจน เจธเฉเจฃเจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ เจ•เจฟ เจ‡เจน เจ•เจฟเจตเฉ‡เจ‚ เจฒเจฟเจ–เจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ" เจฆเฉ€ เจธเจผเฉˆเจฒเฉ€ เจตเจฟเฉฑเจš SQL เจธเจตเจพเจฒเจพเจ‚ เจจเฉ‚เฉฐ เจตเจฟเจ•เจธเจค เจ•เจฐเจจ เจฆเฉ€ เจธเจฎเฉฑเจธเจฟเจ†, เจ‡เจธเจฆเฉ‡ เจจเจพเจฒ, เจธเจจเจฎเจพเจจ เจฆเฉ€ เจœเจ—เฉเจนเจพ เจฒเฉˆเจ‚เจฆเฉ€ เจนเฉˆ. SQL เจตเจฟเฉฑเจš เจธเจฅเจฟเจคเฉ€ เจฆเฉ‡ เจฎเฉเจฒเจพเจ‚เจ•เจฃ เจฆเฉ€เจ†เจ‚ เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพเจตเจพเจ‚.

เจ…เฉฑเจœ, เจฌเจนเฉเจค เจนเฉ€ เจธเจงเจพเจฐเจจ เจ‰เจฆเจพเจนเจฐเจฃเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ, เจ†เจ“ เจฆเฉ‡เจ–เฉ€เจ เจ•เจฟ เจ‡เจธ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจ เจฆเฉ‡ เจธเฉฐเจฆเจฐเจญ เจตเจฟเฉฑเจš เจ•เฉ€ เจนเฉ‹ เจธเจ•เจฆเจพ เจนเฉˆ GROUP/DISTINCT ะธ LIMIT เจ‰เจนเจจเจพเจ‚ เจจเจพเจฒ.

เจœเฉ‡เจ•เจฐ เจคเฉเจธเฉ€เจ‚ เจฌเฉ‡เจจเจคเฉ€ เจตเจฟเฉฑเจš เจฒเจฟเจ–เจฟเจ† เจนเฉˆ เจคเจพเจ‚ เจ‡เจน เจนเฉˆ "เจชเจนเจฟเจฒเจพเจ‚ เจ‡เจนเจจเจพเจ‚ เจ—เฉ‹เจฒเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจœเฉ‹เฉœเฉ‹, เจ…เจคเฉ‡ เจซเจฟเจฐ เจธเจพเจฐเฉ‡ เจกเฉเจชเจฒเฉ€เจ•เฉ‡เจŸเจธ เจจเฉ‚เฉฐ เจฌเจพเจนเจฐ เจธเฉเฉฑเจŸ เจฆเจฟเจ“, เจธเจฟเจฐเจซเจผ เจ‡เฉฑเจ• เจนเฉ€ เจนเฉ‹เจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ เจนเจฐเฉ‡เจ• เจ•เฉเฉฐเจœเฉ€ เจฒเจˆ เจ‰เจฆเจพเจนเจฐเจจ" - เจ‡เจน เจฌเจฟเจฒเจ•เฉเจฒ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจ•เฉฐเจฎ เจ•เจฐเฉ‡เจ—เจพ, เจญเจพเจตเฉ‡เจ‚ เจ•เฉเจจเฉˆเจ•เจธเจผเจจ เจฆเฉ€ เจฌเจฟเจฒเจ•เฉเจฒ เจฒเฉ‹เฉœ เจจเจนเฉ€เจ‚ เจธเฉ€เฅค

เจ…เจคเฉ‡ เจ•เจˆ เจตเจพเจฐ เจคเฉเจธเฉ€เจ‚ เจ–เฉเจธเจผเจ•เจฟเจธเจฎเจค เจนเฉเฉฐเจฆเฉ‡ เจนเฉ‹ เจ…เจคเฉ‡ เจ‡เจน "เจธเจฟเจฐเจซเจผ เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆ", เจ•เจˆ เจตเจพเจฐ เจ‡เจธเจฆเจพ เจชเฉเจฐเจฆเจฐเจธเจผเจจ 'เจคเฉ‡ เจ‡เฉฑเจ• เจ•เฉ‹เจเจพ เจชเฉเจฐเจญเจพเจต เจนเฉเฉฐเจฆเจพ เจนเฉˆ, เจ…เจคเฉ‡ เจ•เจˆ เจตเจพเจฐ เจ‡เจน เจชเฉเจฐเจญเจพเจต เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ เจœเฉ‹ เจตเจฟเจ•เจพเจธเจ•เจฐเจคเจพ เจฆเฉ‡ เจฆเฉเจฐเจฟเจธเจผเจŸเฉ€เจ•เฉ‹เจฃ เจคเฉ‹เจ‚ เจฌเจฟเจฒเจ•เฉเจฒ เจ…เจฃเจ•เจฟเจ†เจธเฉ‡ เจนเฉเฉฐเจฆเฉ‡ เจนเจจเฅค

PostgreSQL เจเจ‚เจŸเฉ€เจชเฉˆเจŸเจฐเจจ: "เจธเจฟเจฐเจซเจผ เจ‡เฉฑเจ• เจนเฉ€ เจนเฉ‹เจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ!"
เจ–เฉˆเจฐ, เจธเจผเจพเจ‡เจฆ เจ‡เฉฐเจจเจพ เจธเจผเจพเจจเจฆเจพเจฐ เจจเจนเฉ€เจ‚, เจชเจฐโ€ฆ

"เจฎเจฟเฉฑเจ เจพ เจœเฉ‹เฉœเจพ": JOIN + DISTINCT

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

เจ‡เจน เจ•เจฟเจตเฉ‡เจ‚ เจธเจชเฉฑเจธเจผเจŸ เจนเฉ‹เจตเฉ‡เจ—เจพ เจ•เจฟ เจ‰เจน เจ•เฉ€ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจนเจจ เจ…เจœเจฟเจนเฉ‡ เจฐเจฟเจ•เจพเจฐเจก X เจฆเฉ€ เจšเฉ‹เจฃ เจ•เจฐเฉ‹, เจœเจฟเจธ เจฒเจˆ Y เจตเจฟเฉฑเจš เจชเฉ‚เจฐเฉ€ เจนเฉ‹เจˆ เจธเจผเจฐเจค เจจเจพเจฒ เจธเจฌเฉฐเจงเจฟเจค เจนเจจ. เจฐเจพเจนเฉ€เจ‚ เจฌเฉ‡เจจเจคเฉ€ เจ•เฉ€เจคเฉ€ JOIN - pk เจฆเฉ‡ เจ•เฉเจ เจฎเฉเฉฑเจฒ เจ•เจˆ เจตเจพเจฐ เจชเฉเจฐเจพเจชเจค เจ•เฉ€เจคเฉ‡ (เจฌเจฟเจฒเจ•เฉเจฒ เจ•เจฟเฉฐเจจเฉ‡ เจขเฉเจ•เจตเฉ‡เจ‚ เจฐเจฟเจ•เจพเจฐเจก Y เจตเจฟเฉฑเจš เจจเจฟเจ•เจฒเฉ‡)เฅค เจ•เจฟเจตเฉ‡เจ‚ เจนเจŸเจพเจ‰เจฃเจพ เจนเฉˆ? เจฏเจ•เฉ€เจจเจจ DISTINCT!

เจ‡เจน เจ–เจพเจธ เจคเฉŒเจฐ 'เจคเฉ‡ "เจธเฉเจนเจพเจตเจฃเจพ" เจนเฉเฉฐเจฆเจพ เจนเฉˆ เจœเจฆเฉ‹เจ‚ เจนเจฐเฉ‡เจ• เจเจ•เจธ-เจฐเจฟเจ•เจพเจฐเจก เจฒเจˆ เจ•เจˆ เจธเฉŒ เจธเฉฐเจฌเฉฐเจงเจฟเจค Y-เจฐเจฟเจ•เจพเจฐเจก เจนเฉเฉฐเจฆเฉ‡ เจนเจจ, เจ…เจคเฉ‡ เจซเจฟเจฐ เจกเฉเจชเจฒเฉ€เจ•เฉ‡เจŸ เจฌเจนเจพเจฆเจฐเฉ€ เจจเจพเจฒ เจนเจŸเจพ เจฆเจฟเฉฑเจคเฉ‡ เจœเจพเจ‚เจฆเฉ‡ เจนเจจ ...

PostgreSQL เจเจ‚เจŸเฉ€เจชเฉˆเจŸเจฐเจจ: "เจธเจฟเจฐเจซเจผ เจ‡เฉฑเจ• เจนเฉ€ เจนเฉ‹เจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ!"

เจ•เจฟเจตเฉ‡เจ‚ เจ เฉ€เจ• เจ•เจฐเจจเจพ เจนเฉˆ? เจธเจผเฉเจฐเฉ‚ เจ•เจฐเจจ เจฒเจˆ, เจ‡เจน เจฎเจนเจฟเจธเฉ‚เจธ เจ•เจฐเฉ‹ เจ•เจฟ เจ•เฉฐเจฎ เจจเฉ‚เฉฐ เจ‡เจธ เจตเจฟเฉฑเจš เจธเฉ‹เจงเจฟเจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ "เจ‰เจจเฉเจนเจพเจ‚ เจฐเจฟเจ•เจพเจฐเจกเจพเจ‚ เจฆเฉ€ เจšเฉ‹เจฃ เจ•เจฐเฉ‹ X เจœเจฟเจจเฉเจนเจพเจ‚ เจฒเจˆ Y เจตเจฟเฉฑเจš เจ˜เฉฑเจŸเฉ‹-เจ˜เฉฑเจŸ เจ‡เฉฑเจ• เจฆเฉ€ เจชเฉ‚เจฐเจคเฉ€ เจนเฉ‹เจฃ เจตเจพเจฒเฉ€ เจธเจผเจฐเจค เจจเจพเจฒ เจธเจฌเฉฐเจงเจฟเจค เจนเฉˆ" - เจ†เจ–เจผเจฐเจ•เจพเจฐ, เจธเจพเจจเฉ‚เฉฐ Y-เจฐเจฟเจ•เจพเจฐเจก เจคเฉ‹เจ‚ เจ•เจฟเจธเฉ‡ เจšเฉ€เจœเจผ เจฆเฉ€ เจฒเฉ‹เฉœ เจจเจนเฉ€เจ‚ เจนเฉˆเฅค

เจจเฉ‡เจธเจŸเจก เจฎเฉŒเจœเฉ‚เจฆ เจนเฉˆ

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

PostgreSQL เจฆเฉ‡ เจ•เฉเจ เจธเฉฐเจธเจ•เจฐเจฃ เจธเจฎเจเจฆเฉ‡ เจนเจจ เจ•เจฟ เจฎเฉŒเจœเฉ‚เจฆ เจตเจฟเฉฑเจš เจ‡เจน เจชเจนเจฟเจฒเจพ เจฐเจฟเจ•เจพเจฐเจก เจฒเฉฑเจญเจฃ เจฒเจˆ เจ•เจพเจซเฉ€ เจนเฉˆ เจœเฉ‹ เจธเจพเจนเจฎเจฃเฉ‡ เจ†เจ‰เจ‚เจฆเจพ เจนเฉˆ, เจชเฉเจฐเจพเจฃเฉ‡ เจฒเฉ‹เจ• เจจเจนเฉ€เจ‚ เจ•เจฐเจฆเฉ‡เฅค เจ‡เจธ เจฒเจˆ, เจฎเฉˆเจ‚ เจนเจฎเฉ‡เจธเจผเจพเจ‚ เจธเฉฐเจ•เฉ‡เจค เจฆเฉ‡เจฃเจพ เจชเจธเฉฐเจฆ เจ•เจฐเจฆเจพ เจนเจพเจ‚ 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

เจ‡เจนเฉ‹ เจœเจฟเจนเฉ€เจ†เจ‚ เจšเฉ€เจœเจผเจพเจ‚ เจตเฉฑเจ–เฉ‹-เจตเฉฑเจ–เจฐเฉ€เจ†เจ‚ เจตเจฟเฉฑเจš เจตเจพเจชเจฐเจฆเฉ€เจ†เจ‚ เจนเจจ เจ…เจงเฉ‚เจฐเฉ‡เจชเจฃ เจฆเฉ€ เจœเจพเจ‚เจš เจฒเฉ‡เจฌเจฒ เจœเจพเจ‚ CTEs เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจฌเฉ‡เจจเจคเฉ€ เจ…เฉฑเจ—เฉ‡ เจตเจงเจฆเฉ€ เจนเฉˆ:

...
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 เจตเจฟเจ•เฉ€ เจคเฉ‹เจ‚ "เจ—เจฐเฉ€เจฌเจพเจ‚ เจฒเจˆ เจตเฉฑเจ–เจฐเจพ":

PostgreSQL เจเจ‚เจŸเฉ€เจชเฉˆเจŸเจฐเจจ: "เจธเจฟเจฐเจซเจผ เจ‡เฉฑเจ• เจนเฉ€ เจนเฉ‹เจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ!"

เจธเจฐเฉ‹เจค: www.habr.com

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹