PostgreSQL āĻ…ā§āĻ¯āĻžāĻ¨ā§āĻŸāĻŋāĻĒā§āĻ¯āĻžāĻŸāĻžāĻ°ā§āĻ¨āĻ¸: "āĻāĻ•āĻŽāĻžāĻ¤ā§āĻ° āĻĨāĻžāĻ•āĻ¤ā§‡ āĻšāĻŦā§‡!"

āĻāĻ¸āĻ•āĻŋāĻ‰āĻāĻ˛-āĻ, āĻ†āĻĒāĻ¨āĻŋ "āĻ•ā§€" āĻĒā§‡āĻ¤ā§‡ āĻšāĻžāĻ¨ āĻ¤āĻž āĻŦāĻ°ā§āĻŖāĻ¨āĻž āĻ•āĻ°ā§‡āĻ¨, "āĻ•āĻŋāĻ­āĻžāĻŦā§‡" āĻ•āĻ°āĻž āĻ‰āĻšāĻŋāĻ¤ āĻ¨āĻ¯āĻŧāĨ¤ āĻ¸ā§āĻ¤āĻ°āĻžāĻ‚, "āĻ¯ā§‡āĻŽāĻ¨ āĻļā§‹āĻ¨āĻž āĻ¯āĻžāĻ¯āĻŧ āĻ¯ā§‡āĻ­āĻžāĻŦā§‡ āĻāĻŸāĻŋ āĻ˛ā§‡āĻ–āĻž āĻšāĻ¯āĻŧ" āĻ¸ā§āĻŸāĻžāĻ‡āĻ˛ā§‡ āĻāĻ¸āĻ•āĻŋāĻ‰āĻāĻ˛ āĻ•ā§‹āĻ¯āĻŧā§‡āĻ°āĻŋ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻžāĻ° āĻ¸āĻŽāĻ¸ā§āĻ¯āĻžāĻŸāĻŋ āĻ¤āĻžāĻ° āĻ¸āĻŽā§āĻŽāĻžāĻ¨ā§‡āĻ° āĻœāĻžāĻ¯āĻŧāĻ—āĻž āĻ¨ā§‡āĻ¯āĻŧ āĻāĻ¸āĻ•āĻŋāĻ‰āĻāĻ˛-āĻ āĻļāĻ°ā§āĻ¤ āĻŽā§‚āĻ˛ā§āĻ¯āĻžāĻ¯āĻŧāĻ¨ā§‡āĻ° āĻŦāĻŋāĻļā§‡āĻˇāĻ¤ā§āĻŦ.

āĻ†āĻœ, āĻ…āĻ¤ā§āĻ¯āĻ¨ā§āĻ¤ āĻ¸āĻšāĻœ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡, āĻ†āĻ¸ā§āĻ¨ āĻāĻŸāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻžāĻ° āĻĒā§āĻ°āĻ¸āĻ™ā§āĻ—ā§‡ āĻ•ā§€ āĻšāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ āĻ¤āĻž āĻĻā§‡āĻ–āĻž āĻ¯āĻžāĻ• GROUP/DISTINCT и LIMIT āĻ¤āĻžāĻĻā§‡āĻ° āĻ¸āĻžāĻĨā§‡.

āĻ¯āĻĻāĻŋ āĻ†āĻĒāĻ¨āĻŋ āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ā§‡ āĻ˛āĻŋāĻ–ā§‡āĻ›ā§‡āĻ¨ āĻ¯ā§‡ "āĻĒā§āĻ°āĻĨāĻŽā§‡ āĻāĻ‡ āĻŸā§āĻ¯āĻžāĻŦāĻ˛ā§‡āĻŸāĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻ¸āĻ‚āĻ¯ā§āĻ•ā§āĻ¤ āĻ•āĻ°ā§āĻ¨ āĻāĻŦāĻ‚ āĻ¤āĻžāĻ°āĻĒāĻ°ā§‡ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ¸āĻĻā§ƒāĻļāĻ—ā§āĻ˛āĻŋ āĻĢā§‡āĻ˛ā§‡ āĻĻāĻŋāĻ¨, āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻāĻ•āĻŸāĻŋ āĻšāĻ¤ā§‡ āĻšāĻŦā§‡ āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻ•ā§€āĻ° āĻœāĻ¨ā§āĻ¯ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ" - āĻ¸āĻ‚āĻ¯ā§‹āĻ—ā§‡āĻ° āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ āĻ¨āĻž āĻĨāĻžāĻ•āĻ˛ā§‡āĻ“ āĻāĻŸāĻŋ āĻ āĻŋāĻ• āĻ•ā§€āĻ­āĻžāĻŦā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻŦā§‡āĨ¤

āĻāĻŦāĻ‚ āĻ•āĻ–āĻ¨āĻ“ āĻ•āĻ–āĻ¨āĻ“ āĻ†āĻĒāĻ¨āĻŋ āĻ­āĻžāĻ—ā§āĻ¯āĻŦāĻžāĻ¨ āĻāĻŦāĻ‚ āĻāĻŸāĻŋ "āĻļā§āĻ§ā§ āĻ•āĻžāĻœ āĻ•āĻ°ā§‡", āĻ•āĻ–āĻ¨āĻ“ āĻ•āĻ–āĻ¨āĻ“ āĻāĻŸāĻŋ āĻ•āĻ°ā§āĻŽāĻ•ā§āĻˇāĻŽāĻ¤āĻžāĻ¤ā§‡ āĻāĻ•āĻŸāĻŋ āĻ…āĻĒā§āĻ°ā§€āĻ¤āĻŋāĻ•āĻ° āĻĒā§āĻ°āĻ­āĻžāĻŦ āĻĢā§‡āĻ˛ā§‡ āĻāĻŦāĻ‚ āĻ•āĻ–āĻ¨āĻ“ āĻ•āĻ–āĻ¨āĻ“ āĻāĻŸāĻŋ āĻāĻŽāĻ¨ āĻĒā§āĻ°āĻ­āĻžāĻŦ āĻĻā§‡āĻ¯āĻŧ āĻ¯āĻž āĻŦāĻŋāĻ•āĻžāĻļāĻ•āĻžāĻ°ā§€āĻ° āĻĻā§ƒāĻˇā§āĻŸāĻŋāĻ•ā§‹āĻŖ āĻĨā§‡āĻ•ā§‡ āĻāĻ•ā§‡āĻŦāĻžāĻ°ā§‡ āĻ…āĻĒā§āĻ°āĻ¤ā§āĻ¯āĻžāĻļāĻŋāĻ¤āĨ¤

PostgreSQL āĻ…ā§āĻ¯āĻžāĻ¨ā§āĻŸāĻŋāĻĒā§āĻ¯āĻžāĻŸāĻžāĻ°ā§āĻ¨āĻ¸: "āĻāĻ•āĻŽāĻžāĻ¤ā§āĻ° āĻĨāĻžāĻ•āĻ¤ā§‡ āĻšāĻŦā§‡!"
āĻ āĻŋāĻ• āĻ†āĻ›ā§‡, āĻ¸āĻŽā§āĻ­āĻŦāĻ¤ āĻ¤ā§‡āĻŽāĻ¨ āĻĻāĻ°ā§āĻļāĻ¨ā§€āĻ¯āĻŧ āĻ¨āĻ¯āĻŧ, āĻ¤āĻŦā§‡â€Ļ

"āĻŽāĻŋāĻˇā§āĻŸāĻŋ āĻĻāĻŽā§āĻĒāĻ¤āĻŋ": āĻ¯ā§‹āĻ— āĻĻāĻŋāĻ¨ + āĻ†āĻ˛āĻžāĻĻāĻž

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

āĻ¤āĻžāĻ°āĻž āĻ•ā§€ āĻšāĻžāĻ¯āĻŧ āĻ¤āĻž āĻ•ā§€āĻ­āĻžāĻŦā§‡ āĻĒāĻ°āĻŋāĻˇā§āĻ•āĻžāĻ° āĻšāĻŦā§‡ āĻāĻ‡ āĻ§āĻ°āĻ¨ā§‡āĻ° āĻ°ā§‡āĻ•āĻ°ā§āĻĄāĻ—ā§āĻ˛āĻŋ āĻ¨āĻŋāĻ°ā§āĻŦāĻžāĻšāĻ¨ āĻ•āĻ°ā§āĻ¨ X, āĻ¯āĻžāĻ° āĻœāĻ¨ā§āĻ¯ Y-āĻ¤ā§‡ āĻĒā§‚āĻ°ā§āĻŖ āĻļāĻ°ā§āĻ¤ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ¯ā§āĻ•ā§āĻ¤ āĻ†āĻ›ā§‡. āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻāĻ•āĻŸāĻŋ āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ āĻœāĻŽāĻž āĻĻā§‡āĻ“āĻ¯āĻŧāĻž JOIN - pk āĻāĻ° āĻ•āĻŋāĻ›ā§ āĻŽāĻžāĻ¨ āĻŦā§‡āĻļ āĻ•āĻ¯āĻŧā§‡āĻ•āĻŦāĻžāĻ° āĻĒā§‡āĻ¯āĻŧā§‡āĻ›āĻŋ (āĻ āĻŋāĻ• āĻ•āĻ¤āĻ—ā§āĻ˛āĻŋ āĻ‰āĻĒāĻ¯ā§āĻ•ā§āĻ¤ āĻ°ā§‡āĻ•āĻ°ā§āĻĄ Y āĻ¤ā§‡ āĻĒāĻ°āĻŋāĻŖāĻ¤ āĻšāĻ¯āĻŧā§‡āĻ›ā§‡)āĨ¤ āĻ•āĻŋāĻ­āĻžāĻŦā§‡ āĻ…āĻĒāĻ¸āĻžāĻ°āĻŖ? āĻ…āĻŦāĻļā§āĻ¯āĻ‡ DISTINCT!

āĻāĻŸāĻŋ āĻŦāĻŋāĻļā§‡āĻˇāĻ¤ "āĻ¸ā§āĻ¨ā§āĻĻāĻ°" āĻ¯āĻ–āĻ¨ āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻāĻ•ā§āĻ¸-āĻ°ā§‡āĻ•āĻ°ā§āĻĄā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ•āĻ¯āĻŧā§‡āĻ•āĻļāĻ¤ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•āĻŋāĻ¤ Y-āĻ°ā§‡āĻ•āĻ°ā§āĻĄ āĻĨāĻžāĻ•ā§‡ āĻāĻŦāĻ‚ āĻ¤āĻžāĻ°āĻĒāĻ°ā§‡ āĻ¸āĻĻā§ƒāĻļāĻ—ā§āĻ˛āĻŋ āĻŦā§€āĻ°āĻ¤ā§āĻŦā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ¸āĻ°āĻžāĻ¨ā§‹ āĻšāĻ¯āĻŧ ...

PostgreSQL āĻ…ā§āĻ¯āĻžāĻ¨ā§āĻŸāĻŋāĻĒā§āĻ¯āĻžāĻŸāĻžāĻ°ā§āĻ¨āĻ¸: "āĻāĻ•āĻŽāĻžāĻ¤ā§āĻ° āĻĨāĻžāĻ•āĻ¤ā§‡ āĻšāĻŦā§‡!"

āĻ•āĻŋāĻ­āĻžāĻŦā§‡ āĻ āĻŋāĻ• āĻ•āĻ°āĻŦā§‹? āĻļā§āĻ°ā§ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯, āĻŦā§āĻāĻ¤ā§‡ āĻšāĻŦā§‡ āĻ¯ā§‡ āĻ•āĻžāĻœāĻŸāĻŋ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ "āĻāĻ•ā§āĻ¸ā§‡āĻ° āĻ°ā§‡āĻ•āĻ°ā§āĻĄ āĻ¨āĻŋāĻ°ā§āĻŦāĻžāĻšāĻ¨ āĻ•āĻ°ā§āĻ¨ āĻ¯āĻžāĻ° āĻœāĻ¨ā§āĻ¯ 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;

āĻāĻ•āĻ‡ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒāĻŸāĻŋ, āĻ¯āĻĻāĻŋ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ āĻšāĻ¯āĻŧ, āĻ…āĻŦāĻŋāĻ˛āĻŽā§āĻŦā§‡ āĻĒāĻžāĻ“āĻ¯āĻŧāĻž āĻ¸āĻ‚āĻļā§āĻ˛āĻŋāĻˇā§āĻŸ Y-āĻ°ā§‡āĻ•āĻ°ā§āĻĄ āĻĨā§‡āĻ•ā§‡ āĻāĻ•āĻ‡ āĻ¸āĻŽāĻ¯āĻŧā§‡ āĻ•āĻŋāĻ›ā§ āĻĄā§‡āĻŸāĻž āĻĢā§‡āĻ°āĻ¤ āĻĻā§‡āĻ“āĻ¯āĻŧāĻžāĻ° āĻ…āĻ¨ā§āĻŽāĻ¤āĻŋ āĻĻā§‡āĻ¯āĻŧāĨ¤ āĻ…āĻ¨ā§āĻ°ā§‚āĻĒ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ā§‡ āĻ†āĻ˛ā§‹āĻšāĻ¨āĻž āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡ "PostgreSQL āĻ…ā§āĻ¯āĻžāĻ¨ā§āĻŸāĻŋāĻĒā§āĻ¯āĻžāĻŸāĻžāĻ°ā§āĻ¨āĻ¸: āĻŦāĻŋāĻ°āĻ˛ āĻ°ā§‡āĻ•āĻ°ā§āĻĄ āĻ¯ā§‹āĻ—āĻĻāĻžāĻ¨ā§‡āĻ° āĻŽāĻžāĻāĻ–āĻžāĻ¨ā§‡ āĻĒā§ŒāĻāĻ›ā§‡ āĻ¯āĻžāĻŦā§‡".

"āĻ•ā§‡āĻ¨ āĻŦā§‡āĻļāĻŋ āĻ…āĻ°ā§āĻĨ āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻ•āĻ°āĻŦā§‡āĻ¨": DISTINCT [ON] + LIMIT 1

āĻāĻ‡ āĻ§āĻ°āĻ¨ā§‡āĻ° āĻ•ā§āĻ¯ā§‹āĻ¯āĻŧāĻžāĻ°ā§€ āĻŸā§āĻ°āĻžāĻ¨ā§āĻ¸āĻĢāĻ°āĻŽā§‡āĻļāĻ¨ā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻ…āĻ¤āĻŋāĻ°āĻŋāĻ•ā§āĻ¤ āĻ¸ā§āĻŦāĻŋāĻ§āĻž āĻšāĻ˛ āĻ°ā§‡āĻ•āĻ°ā§āĻĄā§‡āĻ° āĻ—āĻŖāĻ¨āĻž āĻ¸āĻšāĻœā§‡ āĻ¸ā§€āĻŽāĻŋāĻ¤ āĻ•āĻ°āĻžāĻ° āĻ•ā§āĻˇāĻŽāĻ¤āĻž āĻ¯āĻĻāĻŋ āĻ¸ā§‡āĻ—ā§āĻ˛āĻŋāĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻŽāĻžāĻ¤ā§āĻ° āĻāĻ•/āĻ•āĻŸāĻŋ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ āĻšāĻ¯āĻŧ, āĻ¯ā§‡āĻŽāĻ¨ āĻ¨āĻŋāĻŽā§āĻ¨āĻ˛āĻŋāĻ–āĻŋāĻ¤ āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡:

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

āĻāĻ–āĻ¨ āĻ†āĻŽāĻ°āĻž āĻ…āĻ¨ā§āĻ°ā§‹āĻ§āĻŸāĻŋ āĻĒāĻĄāĻŧāĻŋ āĻāĻŦāĻ‚ āĻĄāĻŋāĻŦāĻŋāĻāĻŽāĻāĻ¸ āĻ•ā§€ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡ āĻ¤āĻž āĻŦā§‹āĻāĻžāĻ° āĻšā§‡āĻˇā§āĻŸāĻž āĻ•āĻ°āĻŋ:

  • āĻ†āĻŽāĻ°āĻž āĻĒā§āĻ˛ā§‡āĻŸ āĻ¸āĻ‚āĻ¯ā§‹āĻ—
  • 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 āĻ¤āĻžāĻ°āĻž āĻ–ā§āĻŦ āĻŦāĻ¨ā§āĻ§ā§āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖ āĻ¨āĻ¯āĻŧāĨ¤

āĻŦāĻŋāĻ•āĻžāĻļāĻ•āĻžāĻ°ā§€ āĻ­āĻžāĻŦāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ "āĻāĻ–āĻ¨, āĻ¯āĻĻāĻŋ āĻ¸ā§‡āĻ–āĻžāĻ¨ā§‡ āĻ°ā§‡āĻ•āĻ°ā§āĻĄ āĻĨāĻžāĻ•ā§‡, āĻ¤āĻžāĻšāĻ˛ā§‡ āĻ†āĻŽāĻžāĻ° 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

āĻāĻ•āĻŸāĻŋ āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻœā§āĻĄāĻŧā§āĻ¨