PostgreSQL Antipatterns: "แƒฃแƒœแƒ“แƒ แƒ“แƒแƒ แƒฉแƒ”แƒก แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ”แƒ แƒ—แƒ˜!"

SQL-แƒจแƒ˜ แƒแƒฆแƒฌแƒ”แƒ แƒ— โ€žแƒ แƒ˜แƒกโ€œ แƒ›แƒ˜แƒฆแƒฌแƒ”แƒ•แƒแƒก แƒ’แƒกแƒฃแƒ แƒ— แƒ“แƒ แƒแƒ แƒ โ€žแƒ แƒแƒ’แƒแƒ โ€œ แƒฃแƒœแƒ“แƒ แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ“แƒ”แƒก. แƒแƒ›แƒ แƒ˜แƒ’แƒแƒ“, SQL แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ˜แƒก แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ แƒกแƒขแƒ˜แƒšแƒจแƒ˜ "แƒ แƒแƒ’แƒแƒ แƒช แƒ˜แƒกแƒ›แƒ˜แƒก, แƒ แƒแƒ’แƒแƒ  แƒฌแƒ”แƒ แƒ˜แƒ" แƒ—แƒแƒ•แƒ˜แƒก แƒกแƒแƒžแƒแƒขแƒ˜แƒ แƒแƒ“แƒ’แƒ˜แƒšแƒก แƒ˜แƒ™แƒแƒ•แƒ”แƒ‘แƒก. SQL-แƒจแƒ˜ แƒžแƒ˜แƒ แƒแƒ‘แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒ—แƒ•แƒšแƒ˜แƒก แƒ›แƒแƒฎแƒแƒกแƒ˜แƒแƒ—แƒ”แƒ‘แƒšแƒ”แƒ‘แƒ˜.

แƒ“แƒฆแƒ”แƒก, แƒฃแƒ™แƒ˜แƒ“แƒฃแƒ แƒ”แƒกแƒแƒ“ แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜ แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—, แƒ•แƒœแƒแƒฎแƒแƒ—, แƒ แƒ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ’แƒแƒ›แƒแƒ˜แƒฌแƒ•แƒ˜แƒแƒก แƒแƒ›แƒแƒœ แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒก แƒ™แƒแƒœแƒขแƒ”แƒฅแƒกแƒขแƒจแƒ˜ GROUP/DISTINCT ะธ LIMIT แƒ›แƒแƒ—แƒ—แƒแƒœ แƒ”แƒ แƒ—แƒแƒ“.

แƒแƒฎแƒšแƒ แƒ—แƒฃ แƒ“แƒแƒฌแƒ”แƒ แƒ” แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒแƒจแƒ˜ โ€แƒฏแƒ”แƒ  แƒ“แƒแƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ— แƒ”แƒก แƒœแƒ˜แƒจแƒœแƒ”แƒ‘แƒ˜ แƒ“แƒ แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒ’แƒแƒ“แƒแƒแƒ’แƒ“แƒ”แƒ— แƒงแƒ•แƒ”แƒšแƒ แƒ“แƒฃแƒ‘แƒšแƒ˜แƒ™แƒแƒขแƒ˜, แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ”แƒ แƒ—แƒ˜ แƒฃแƒœแƒ“แƒ แƒ“แƒแƒ แƒฉแƒ”แƒก แƒ“แƒแƒแƒ™แƒแƒžแƒ˜แƒ แƒ”แƒ— แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ แƒ’แƒแƒกแƒแƒฆแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก" - แƒ–แƒฃแƒกแƒขแƒแƒ“ แƒแƒกแƒ” แƒ˜แƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒก, แƒ—แƒฃแƒœแƒ“แƒแƒช แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜ แƒกแƒแƒ”แƒ แƒ—แƒแƒ“ แƒแƒ  แƒ˜แƒงแƒแƒก แƒกแƒแƒญแƒ˜แƒ แƒ.

แƒฎแƒแƒœแƒ“แƒแƒฎแƒแƒœ แƒ’แƒแƒ’แƒ˜แƒ›แƒแƒ แƒ—แƒšแƒแƒ— แƒ“แƒ แƒ˜แƒก โ€žแƒฃแƒ‘แƒ แƒแƒšแƒแƒ“ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒกโ€œ, แƒฎแƒแƒœ แƒฃแƒกแƒ˜แƒแƒ›แƒแƒ•แƒœแƒ แƒ’แƒแƒ•แƒšแƒ”แƒœแƒแƒก แƒแƒฎแƒ“แƒ”แƒœแƒก แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒแƒ–แƒ”, แƒฎแƒแƒœ แƒ™แƒ˜ แƒ˜แƒซแƒšแƒ”แƒ•แƒ แƒ”แƒคแƒ”แƒฅแƒขแƒ”แƒ‘แƒก, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ˜แƒช แƒกแƒ แƒฃแƒšแƒ˜แƒแƒ“ แƒ›แƒแƒฃแƒšแƒแƒ“แƒœแƒ”แƒšแƒ˜แƒ แƒ“แƒ”แƒ•แƒ”แƒšแƒแƒžแƒ”แƒ แƒ˜แƒก แƒ—แƒ•แƒแƒšแƒกแƒแƒ–แƒ แƒ˜แƒกแƒ˜แƒ—.

PostgreSQL Antipatterns: "แƒฃแƒœแƒ“แƒ แƒ“แƒแƒ แƒฉแƒ”แƒก แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ”แƒ แƒ—แƒ˜!"
แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒแƒ แƒช แƒ˜แƒกแƒ” แƒกแƒแƒœแƒแƒฎแƒแƒแƒ‘แƒ แƒ˜แƒ•แƒ˜, แƒ›แƒแƒ’แƒ แƒแƒ›...

โ€žแƒขแƒ™แƒ‘แƒ˜แƒšแƒ˜ แƒฌแƒงแƒ•แƒ˜แƒšแƒ˜โ€œ: JOIN + DISTINCT

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

แƒ’แƒแƒกแƒแƒ’แƒ”แƒ‘แƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒแƒ“แƒ แƒ แƒ แƒฃแƒœแƒ“แƒแƒ“แƒแƒ— แƒแƒ˜แƒ แƒฉแƒ˜แƒ”แƒ— แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ”แƒ‘แƒ˜ X, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒกแƒแƒช แƒแƒ แƒ˜แƒก แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ”แƒ‘แƒ˜ Y-แƒจแƒ˜, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ˜แƒช แƒ“แƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒฃแƒš แƒžแƒ˜แƒ แƒแƒ‘แƒแƒกแƒ—แƒแƒœ. แƒ“แƒแƒฌแƒ”แƒ แƒ แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ แƒ›แƒ”แƒจแƒ•แƒ”แƒแƒ‘แƒ˜แƒ— JOIN - แƒ แƒแƒ›แƒ“แƒ”แƒœแƒฏแƒ”แƒ แƒ›แƒ” แƒ›แƒ˜แƒ˜แƒฆแƒ pk แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ (แƒ–แƒฃแƒกแƒขแƒแƒ“ แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜ แƒจแƒ”แƒกแƒแƒคแƒ”แƒ แƒ˜แƒกแƒ˜ แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ˜ แƒ’แƒแƒ›แƒแƒฉแƒœแƒ“แƒ Y-แƒจแƒ˜). แƒ แƒแƒ’แƒแƒ  แƒแƒ›แƒแƒ˜แƒฆแƒแƒœ? แฒ แƒ แƒ—แƒฅแƒ›แƒ แƒฃแƒœแƒ“แƒ DISTINCT!

แƒ’แƒแƒœแƒกแƒแƒ™แƒฃแƒ—แƒ แƒ”แƒ‘แƒ˜แƒ— "แƒกแƒแƒกแƒ˜แƒฎแƒแƒ แƒฃแƒšแƒแƒ", แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒš X-แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ–แƒ” แƒแƒ แƒ˜แƒก แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒแƒกแƒ”แƒฃแƒšแƒ˜ แƒ“แƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ Y-แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ˜, แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒ™แƒ˜ แƒ“แƒฃแƒ‘แƒšแƒ˜แƒ™แƒแƒขแƒ”แƒ‘แƒ˜ แƒ’แƒ›แƒ˜แƒ แƒฃแƒšแƒแƒ“ แƒ˜แƒจแƒšแƒ”แƒ‘แƒ...

PostgreSQL Antipatterns: "แƒฃแƒœแƒ“แƒ แƒ“แƒแƒ แƒฉแƒ”แƒก แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ”แƒ แƒ—แƒ˜!"

แƒ แƒแƒ’แƒแƒ  แƒ’แƒแƒ•แƒแƒกแƒฌแƒแƒ แƒ? แƒ“แƒแƒกแƒแƒฌแƒงแƒ˜แƒกแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ’แƒแƒแƒชแƒœแƒแƒ‘แƒ˜แƒ”แƒ แƒ”แƒ—, แƒ แƒแƒ› แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ˜แƒก แƒจแƒ”แƒชแƒ•แƒšแƒ แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ "แƒแƒ˜แƒ แƒฉแƒ˜แƒ”แƒ— แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ˜ X, แƒ แƒแƒ›แƒšแƒ˜แƒกแƒ—แƒ•แƒ˜แƒกแƒแƒช Y-แƒจแƒ˜ แƒแƒ แƒ˜แƒก แƒ›แƒ˜แƒœแƒ˜แƒ›แƒฃแƒ› แƒ”แƒ แƒ—แƒ˜ แƒ“แƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒฃแƒš แƒžแƒ˜แƒ แƒแƒ‘แƒแƒกแƒ—แƒแƒœ" - แƒ‘แƒแƒšแƒแƒก แƒ“แƒ แƒ‘แƒแƒšแƒแƒก, แƒฉแƒ•แƒ”แƒœ แƒแƒ แƒแƒคแƒ”แƒ แƒ˜ แƒ’แƒ•แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ แƒ—แƒแƒ•แƒแƒ“ 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 Antipatterns: แƒ˜แƒจแƒ•แƒ˜แƒแƒ—แƒ˜ แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ˜ แƒ›แƒ˜แƒแƒฆแƒฌแƒ”แƒ•แƒก JOIN-แƒ˜แƒก แƒจแƒฃแƒ แƒ แƒ˜แƒชแƒฎแƒ•แƒ”แƒ‘แƒก".

โ€žแƒ แƒแƒขแƒแƒ› แƒ’แƒแƒ“แƒแƒ˜แƒฎแƒแƒ“แƒแƒ— แƒ›แƒ”แƒขแƒ˜โ€œ: 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 แƒ˜แƒกแƒ˜แƒœแƒ˜ แƒแƒ  แƒแƒ แƒ˜แƒแƒœ แƒซแƒแƒšแƒ˜แƒแƒœ แƒ›แƒ”แƒ’แƒแƒ‘แƒ แƒฃแƒšแƒ”แƒ‘แƒ˜.

แƒ“แƒ”แƒ•แƒ”แƒšแƒแƒžแƒ”แƒ แƒก แƒจแƒ”แƒฃแƒซแƒšแƒ˜แƒ แƒ˜แƒคแƒ˜แƒฅแƒ แƒแƒก โ€แƒ—แƒฃ แƒ˜แƒฅ แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ”แƒ‘แƒ˜แƒ, แƒ›แƒแƒจแƒ˜แƒœ แƒ›แƒ” แƒแƒ  แƒ›แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ LIMIT-แƒ–แƒ” แƒ›แƒ”แƒขแƒ˜โ€. แƒ›แƒแƒ’แƒ แƒแƒ› แƒœแƒฃ แƒ’แƒแƒแƒ™แƒ”แƒ—แƒ”แƒ‘ แƒแƒ›แƒแƒก! แƒ แƒแƒ“แƒ’แƒแƒœ แƒ‘แƒแƒ–แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ”แƒก แƒแƒ แƒ˜แƒก:

  • แƒ“แƒแƒ—แƒ•แƒแƒšแƒ”แƒ— แƒ แƒ แƒฃแƒœแƒ“แƒแƒ— แƒงแƒ•แƒ”แƒšแƒ แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ˜แƒก แƒ›แƒ˜แƒฎแƒ”แƒ“แƒ•แƒ˜แƒ—
  • แƒ›แƒ˜แƒ”แƒชแƒ˜แƒ— แƒ˜แƒ›แƒ“แƒ”แƒœแƒ˜ แƒฎแƒแƒ–แƒ˜, แƒ แƒแƒ›แƒ“แƒ”แƒœแƒกแƒแƒช แƒ˜แƒ—แƒฎแƒแƒ•แƒ”แƒœ

แƒกแƒแƒ›แƒ˜แƒ–แƒœแƒ” แƒžแƒ˜แƒ แƒแƒ‘แƒ”แƒ‘แƒ˜แƒ“แƒแƒœ แƒ’แƒแƒ›แƒแƒ›แƒ“แƒ˜แƒœแƒแƒ แƒ”, แƒ›แƒ˜แƒ–แƒแƒœแƒจแƒ”แƒฌแƒแƒœแƒ˜แƒšแƒ˜แƒ แƒ’แƒแƒœแƒแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒแƒ— แƒ”แƒ แƒ—-แƒ”แƒ แƒ—แƒ˜ แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜ แƒฉแƒแƒœแƒแƒชแƒ•แƒšแƒ”แƒ‘แƒ:

  • (count + LIMIT 1) = 0 on NOT EXISTS(LIMIT 1)
  • (count + LIMIT 1) > 0 on EXISTS(LIMIT 1)
  • count >= N on (SELECT count(*) FROM (... LIMIT N))

โ€žแƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜ แƒ“แƒแƒ™แƒ˜แƒ“แƒ”แƒ‘แƒ แƒ’แƒ แƒแƒ›แƒ”แƒ‘แƒจแƒ˜โ€œ: DISTINCT + LIMIT

SELECT DISTINCT
  pk
FROM
  X
LIMIT $1

แƒ’แƒฃแƒšแƒฃแƒ‘แƒ แƒงแƒ•แƒ˜แƒšแƒ แƒ“แƒ”แƒ•แƒ”แƒšแƒแƒžแƒ”แƒ แƒก แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ’แƒฃแƒšแƒฌแƒ แƒคแƒ”แƒšแƒแƒ“ แƒกแƒฏแƒ”แƒ แƒแƒ“แƒ”แƒก, แƒ แƒแƒ› แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ แƒจแƒ”แƒฌแƒงแƒ•แƒ”แƒขแƒก แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒแƒก. แƒ แƒแƒ’แƒแƒ แƒช แƒ™แƒ˜ แƒ•แƒ˜แƒžแƒแƒ•แƒ˜แƒ— $1 แƒžแƒ˜แƒ แƒ•แƒ”แƒš แƒกแƒฎแƒ•แƒแƒ“แƒแƒกแƒฎแƒ•แƒ แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ”แƒ‘แƒก, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ˜แƒช แƒ’แƒ•แƒฎแƒ•แƒ“แƒ”แƒ‘แƒ.

แƒแƒ“แƒ”แƒกแƒ›แƒ” แƒ›แƒแƒ›แƒแƒ•แƒแƒšแƒจแƒ˜ แƒ”แƒก แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ“แƒ แƒ˜แƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒก แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒ•แƒแƒœแƒซแƒ˜แƒก แƒฌแƒงแƒแƒšแƒแƒ‘แƒ˜แƒ— แƒ˜แƒœแƒ“แƒ”แƒฅแƒกแƒ˜แƒก แƒ’แƒแƒ›แƒแƒขแƒแƒ•แƒ”แƒ‘แƒ แƒกแƒ™แƒแƒœแƒ˜แƒ แƒ”แƒ‘แƒ, แƒ แƒแƒ›แƒšแƒ˜แƒก แƒ’แƒแƒœแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒแƒช แƒแƒ›แƒŸแƒแƒ›แƒแƒ“ แƒ›แƒฃแƒจแƒแƒ•แƒ“แƒ”แƒ‘แƒ, แƒ›แƒแƒ’แƒ แƒแƒ› แƒฏแƒ”แƒ  แƒแƒ แƒ.

แƒฏแƒ”แƒ  แƒฏแƒ”แƒ แƒแƒ‘แƒ˜แƒ— แƒงแƒ•แƒ”แƒšแƒ แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒแƒฆแƒ”แƒ‘แƒฃแƒšแƒ˜, แƒฃแƒœแƒ˜แƒ™แƒแƒšแƒฃแƒ แƒ˜แƒ แƒ“แƒ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ›แƒแƒ—แƒ’แƒแƒœ แƒ“แƒแƒ‘แƒ แƒฃแƒœแƒ“แƒ”แƒ‘แƒ แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ˜แƒšแƒ˜ แƒ—แƒแƒœแƒฎแƒ. แƒ’แƒแƒœแƒกแƒแƒ™แƒฃแƒ—แƒ แƒ”แƒ‘แƒ˜แƒ— แƒกแƒแƒ›แƒฌแƒฃแƒฎแƒแƒ แƒแƒ, แƒ—แƒฃ แƒ แƒแƒฆแƒแƒช แƒ›แƒกแƒ’แƒแƒ•แƒกแƒ˜ แƒ’แƒ•แƒ˜แƒœแƒ“แƒแƒ“แƒ $ 1 = 4, แƒ“แƒ แƒชแƒฎแƒ แƒ˜แƒšแƒจแƒ˜ แƒแƒกแƒแƒ‘แƒ˜แƒ— แƒแƒ—แƒแƒกแƒ˜ แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ˜แƒ...

แƒ˜แƒ›แƒ˜แƒกแƒแƒ—แƒ•แƒ˜แƒก, แƒ แƒแƒ› แƒขแƒงแƒฃแƒ˜แƒšแƒแƒ“ แƒแƒ  แƒ•แƒ˜แƒฌแƒฃแƒฌแƒฃแƒœแƒแƒ—, แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒแƒ— แƒ แƒ”แƒ™แƒฃแƒ แƒกแƒ˜แƒฃแƒšแƒ˜ แƒจแƒ”แƒ™แƒ˜แƒ—แƒฎแƒ•แƒ "DISTINCT แƒแƒ แƒ˜แƒก แƒฆแƒแƒ แƒ˜แƒ‘แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก" PostgreSQL แƒ•แƒ˜แƒ™แƒ˜แƒ“แƒแƒœ:

PostgreSQL Antipatterns: "แƒฃแƒœแƒ“แƒ แƒ“แƒแƒ แƒฉแƒ”แƒก แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ”แƒ แƒ—แƒ˜!"

แƒฌแƒงแƒแƒ แƒ: www.habr.com

แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ