SQL-แจแ แแฆแฌแแ แ โแ แแกโ แแแฆแฌแแแแก แแกแฃแ แ แแ แแ แ โแ แแแแ โ แฃแแแ แจแแกแ แฃแแแแก. แแแ แแแแ, SQL แแแแฎแแแแแแแก แจแแแฃแจแแแแแแก แแ แแแแแแ แกแขแแแจแ "แ แแแแ แช แแกแแแก, แ แแแแ แฌแแ แแ" แแแแแก แกแแแแขแแ แแแแแแก แแแแแแแก.
แแฆแแก, แฃแแแแฃแ แแกแแ แแแ แขแแแ แแแแแแแแแแแก แแแแแงแแแแแแ, แแแแฎแแ, แ แ แจแแแซแแแแ แแแแแแฌแแแแก แแแแ แแแแแงแแแแแแก แแแแขแแฅแกแขแจแ GROUP/DISTINCT
ะธ LIMIT
แแแแแแ แแ แแแ.
แแฎแแ แแฃ แแแฌแแ แ แแแแฎแแแแแจแ โแฏแแ แแแแแแแจแแ แแ แแก แแแจแแแแ แแ แจแแแแแ แแแแแแแแแ แงแแแแ แแฃแแแแแแขแ, แแฎแแแแ แแ แแ แฃแแแ แแแ แฉแแก แแแแแแแแ แแ แแแแแแฃแแ แแแกแแฆแแแแกแแแแก" - แแฃแกแขแแ แแกแ แแแฃแจแแแแแก, แแฃแแแแช แแแแจแแ แ แกแแแ แแแ แแ แแงแแก แกแแญแแ แ.
แฎแแแแแฎแแ แแแแแแแ แแแแ แแ แแก โแฃแแ แแแแ แแฃแจแแแแกโ, แฎแแ แฃแกแแแแแแแ แแแแแแแแก แแฎแแแแก แจแแกแ แฃแแแแแแ, แฎแแ แแ แแซแแแแ แแคแแฅแขแแแก, แ แแแแแแแช แกแ แฃแแแแ แแแฃแแแแแแแแ แแแแแแแแแ แแก แแแแแกแแแ แแกแแ.
แจแแแซแแแแ แแ แช แแกแ แกแแแแฎแแแแ แแแ, แแแแ แแ...
โแขแแแแแ แฌแงแแแแโ: 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-แฉแแแแฌแแ แ, แจแแแแแ แแ แแฃแแแแแแขแแแ แแแแ แฃแแแ แแจแแแแ...
แ แแแแ แแแแแกแฌแแ แ? แแแกแแฌแงแแกแแกแแแแก, แแแแชแแแแแแ แแ, แ แแ แแ แแแแแแแก แจแแชแแแ แจแแกแแซแแแแแแแ "แแแ แฉแแแ แฉแแแแฌแแ แ 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
onNOT EXISTS(LIMIT 1)
(count + LIMIT 1) > 0
onEXISTS(LIMIT 1)
count >= N
on(SELECT count(*) FROM (... LIMIT N))
โแ แแแแแแ แแแแแแแแ แแ แแแแแจแโ: DISTINCT + LIMIT
SELECT DISTINCT
pk
FROM
X
LIMIT $1
แแฃแแฃแแ แงแแแแ แแแแแแแแแ แก แจแแแซแแแแ แแฃแแฌแ แคแแแแ แกแฏแแ แแแแก, แ แแ แแแแฎแแแแ แจแแฌแงแแแขแก แจแแกแ แฃแแแแแก. แ แแแแ แช แแ แแแแแแแ $1 แแแ แแแ แกแฎแแแแแกแฎแแ แแแแจแแแแแแแแแก, แ แแแแแแแช แแแฎแแแแแ.
แแแแกแแ แแแแแแแแจแ แแก แจแแแซแแแแ แแ แแแฃแจแแแแแก แแฎแแแ แแแแแซแแก แฌแงแแแแแแ แแแแแฅแกแแก แแแแแขแแแแแ แกแแแแแ แแแ, แ แแแแแก แแแแฎแแ แชแแแแแแแช แแแแแแแ แแฃแจแแแแแแ, แแแแ แแ แฏแแ แแ แ.
แฏแแ แฏแแ แแแแ แงแแแแ แฉแแแแฌแแ แ แแฅแแแแ แแฆแแแฃแแ, แฃแแแแแแฃแ แแ แแ แแฎแแแแ แแแแแแ แแแแ แฃแแแแแ แแแแฎแแแแแแ แแแแฎแ. แแแแกแแแฃแแ แแแแ แกแแแฌแฃแฎแแ แแ, แแฃ แ แแฆแแช แแกแแแแกแ แแแแแแแแ $ 1 = 4, แแ แชแฎแ แแแจแ แแกแแแแ แแแแกแ แฉแแแแฌแแ แแ...
แแแแกแแแแแก, แ แแ แขแงแฃแแแแ แแ แแแฌแฃแฌแฃแแแ, แแแแแแแงแแแแ แ แแแฃแ แกแแฃแแ แจแแแแแฎแแ
แฌแงแแ แ: www.habr.com