ื-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 ืขืฆืื.
ืืงืื ื ืงืืื
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
ืขื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, ืืืฉ ืืืืช ืืืคื ืจืฉืืืืช ืืืืื...
ืืื ืื ืืืืืช ืขืฆืืืื ืืฉืืื, ืืืื ื ืฉืชืืฉ ืืฉืืืืชื ืจืงืืจืกืืืืช
ืืงืืจ: www.habr.com