PostgreSQL рдПрдВрдЯреАрдкреИрдЯрд░реНрди: "рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП!"

рдПрд╕рдХреНрдпреВрдПрд▓ рдореЗрдВ, рдЖрдк рдпрд╣ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк "рдХреНрдпрд╛" рд╣рд╛рд╕рд┐рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рди рдХрд┐ "рдХреИрд╕реЗ" рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд▓рд┐рдП, "рдЬреИрд╕рд╛ рд╕реБрдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╡реИрд╕рд╛ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ" рдХреА рд╢реИрд▓реА рдореЗрдВ SQL рдХреНрд╡реЗрд░реАрдЬрд╝ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛, рдЗрд╕рдХреЗ рд╕рд╛рде-рд╕рд╛рде рд╕рдореНрдорд╛рди рдХрд╛ рд╕реНрдерд╛рди рд▓реЗрддреА рд╣реИ SQL рдореЗрдВ рд╢рд░реНрддреЛрдВ рдХреА рдЧрдгрдирд╛ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ.

рдЖрдЬ, рдЕрддреНрдпрдВрдд рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИ GROUP/DISTINCT ╨╕ LIMIT рдЙрдирдХреЗ рд╕рд╛рдеред

рдЕрдм, рдпрджрд┐ рдЖрдкрдиреЗ рдЕрдиреБрд░реЛрдз рдореЗрдВ рд▓рд┐рдЦрд╛ рд╣реИ "рдкрд╣рд▓реЗ рдЗрди рд╕рдВрдХреЗрддреЛрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВ, рдФрд░ рдлрд┐рд░ рд╕рднреА рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХреЛ рдмрд╛рд╣рд░ рдлреЗрдВрдХ рджреЗрдВ, рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдХреБрдВрдЬреА рдХреЗ рд▓рд┐рдП рдХреЙрдкреА рдХрд░реЗрдВ" - рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдЗрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рднрд▓реЗ рд╣реА рдХрдиреЗрдХреНрд╢рди рдХреА рдмрд┐рд▓реНрдХреБрд▓ рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рд╣реЛред

рдФрд░ рдХрднреА-рдХрднреА рдЖрдк рднрд╛рдЧреНрдпрд╢рд╛рд▓реА рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ "рдмрд╕ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ", рдХрднреА-рдХрднреА рдЗрд╕рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдкрд░ рдЕрдкреНрд░рд┐рдп рдкреНрд░рднрд╛рд╡ рдкрдбрд╝рддрд╛ рд╣реИ, рдФрд░ рдХрднреА-рдХрднреА рдпрд╣ рдРрд╕реЗ рдкреНрд░рднрд╛рд╡ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╣реЛрддреЗ рд╣реИрдВред

PostgreSQL рдПрдВрдЯреАрдкреИрдЯрд░реНрди: "рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП!"
рдЦрд╝реИрд░, рд╢рд╛рдпрдж рдЗрддрдирд╛ рд╢рд╛рдирджрд╛рд░ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди...

"рдкреНрдпрд╛рд░реА рдЬреЛрдбрд╝реА": рдЬреБрдбрд╝реЗрдВ + рдЕрд▓рдЧ

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

рдЗрд╕рд╕реЗ рд╕рд╛рдл рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рд╡реЗ рдХреНрдпрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд░рд┐рдХреЙрд░реНрдб X рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП Y рдореЗрдВ рдРрд╕реЗ рд░рд┐рдХреЙрд░реНрдб рд╣реИрдВ рдЬреЛ рдкреВрд░реА рдХреА рдЧрдИ рд╢рд░реНрдд рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ. рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдЕрдиреБрд░реЛрдз рд▓рд┐рдЦрд╛ JOIN - рдХреБрдЫ рдкреАрдХреЗ рдорд╛рди рдХрдИ рдмрд╛рд░ рдкреНрд░рд╛рдкреНрдд рд╣реБрдП (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд╛рдИ рдореЗрдВ рдХрд┐рддрдиреА рдЙрдкрдпреБрдХреНрдд рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдБ рджрд┐рдЦрд╛рдИ рджреАрдВ)ред рдХреИрд╕реЗ рд╣рдЯрд╛рдПрдВ? рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ DISTINCT!

рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ "рд╕рдВрддреБрд╖реНрдЯрд┐рджрд╛рдпрдХ" рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдкреНрд░рддреНрдпреЗрдХ рдПрдХреНрд╕-рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд▓рд┐рдП рдХрдИ рд╕реМ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд╛рдИ-рд░рд┐рдХреЙрд░реНрдб рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХреЛ рд╡реАрд░рддрд╛рдкреВрд░реНрд╡рдХ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ...

PostgreSQL рдПрдВрдЯреАрдкреИрдЯрд░реНрди: "рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП!"

рдХреИрд╕реЗ рдареАрдХ рдХрд░реЗрдВ? рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╕рдордЭреЗрдВ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ "рд░рд┐рдХреЙрд░реНрдб X рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП Y рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдкреВрд░реА рд╢рд░реНрдд рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ" - рдЖрдЦрд╝рд┐рд░рдХрд╛рд░, рд╣рдореЗрдВ Y-рд░рд┐рдХреЙрд░реНрдб рд╕реЗ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЪрд╛рд╣рд┐рдПред

рдиреЗрд╕реНрдЯреЗрдб рдореМрдЬреВрдж рд╣реИ

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;

рд╡рд╣реА рд╡рд┐рдХрд▓реНрдк, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рдкрд╛рдП рдЧрдП рд╕рдВрдмрджреНрдз рд╡рд╛рдИ-рд░рд┐рдХреЙрд░реНрдб рд╕реЗ рдХреБрдЫ рдбреЗрдЯрд╛ рддреБрд░рдВрдд рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд▓реЗрдЦ рдореЗрдВ рдПрдХ рд╕рдорд╛рди рд╡рд┐рдХрд▓реНрдк рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИ "рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдПрд╕рдХреНрдпреВрдПрд▓ рдПрдВрдЯреАрдкреИрдЯрд░реНрди: рдПрдХ рджреБрд░реНрд▓рдн рд░рд┐рдХреЙрд░реНрдб рдЬреЙрдЗрди рдХреЗ рдордзреНрдп рддрдХ рдкрд╣реБрдВрдЪ рдЬрд╛рдПрдЧрд╛".

"рдЕрдзрд┐рдХ рднреБрдЧрддрд╛рди рдХреНрдпреЛрдВ рдХрд░реЗрдВ": 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.

"рдореБрдЭреЗ рдмрд╕ рдкреВрдЫрдирд╛ рд╣реИ": рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рдореВрд╣ + рд╕реАрдорд╛

рд╕рдорд╛рди рдЪреАрдЬреЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЬрдЧрд╣реЛрдВ рдкрд░ рд╣реЛрддреА рд╣реИрдВ рдЧреИрд░-рдЦрд╛рд▓реАрдкрди рдХреА рдЬрд╛рдБрдЪ рдЕрдиреБрд░реЛрдз рдмрдврд╝рдиреЗ рдкрд░ рд╕рдВрдХреЗрдд рдпрд╛ рд╕реАрдЯреАрдИ:

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

рд╕рдордЧреНрд░ рдХрд╛рд░реНрдп (count/min/max/sum/...) рд╕реНрдкрд╖реНрдЯ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдмрд┐рдирд╛ рднреА, рдкреВрд░реЗ рд╕реЗрдЯ рдкрд░ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ GROUP BY. рд╕рд┐рд░реНрдл рд╕рд╛рде LIMIT рд╡реЗ рдмрд╣реБрдд рдорд┐рд▓рдирд╕рд╛рд░ рдирд╣реАрдВ рд╣реИрдВ.

рдбреЗрд╡рд▓рдкрд░ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реИ "рдЕрдЧрд░ рд╡рд╣рд╛рдБ рд░рд┐рдХреЙрд░реНрдб рд╣реИрдВ, рддреЛ рдореБрдЭреЗ 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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ