เปเบ SQL, เบเปเบฒเบเบญเบฐเบเบดเบเบฒเบ "เบชเบดเปเบเบเบตเป" เบเปเบฒเบเบเปเบญเบเบเบฒเบเบเบตเปเบเบฐเบเบฑเบเบฅเบธ, เบเปเปเปเบกเปเบ "เบงเบดเบเบตเบเบฒเบ" เบกเบฑเบเบเบงเบเบเบฐเบเบทเบเบเบฐเบเบดเบเบฑเบ. เบเบฑเปเบเบเบฑเปเบ, เบเบฑเบเบซเบฒเบเบญเบเบเบฒเบเบเบฑเบเบเบฐเบเบฒเปเบเบเบชเบญเบเบเบฒเบก SQL เปเบเปเบเบเบเบญเบ "เบเปเบญเบเบงเปเบฒเบกเบฑเบเปเบเปเบเบดเบเปเบกเปเบเบงเบดเบเบตเบเบตเปเบกเบฑเบเบเบทเบเบเบฝเบ" เปเบเปเปเบงเบฅเบฒเปเบเบฑเบเบเบฝเบ, เบเปเบญเบกเบเบฑเบ.
เปเบเบกเบทเปเบเบตเป, เบเบฒเบเบเปเบฒเปเบเปเบเบปเบงเบขเปเบฒเบเบเบตเปเบเปเบฒเบเบเบฒเบเบเบตเปเบชเบธเบ, เปเบซเปเปเบเบดเปเบเบชเบดเปเบเบเบตเปเบเบตเปเบชเบฒเบกเบฒเบเบเปเบฒเปเบเบชเบนเปเบเบฒเบเปเบเบชเบฐเบเบฒเบเบเบฒเบเบเบญเบเบเบฒเบเบเปเบฒเปเบเป GROUP/DISTINCT
ะธ LIMIT
เบเบฑเบโเบเบงเบโเปเบเบปเบฒ.
เปเบเบเบฑเบเบเบธเบเบฑเบ, เบเปเบฒเบเปเบฒเบเบเบฝเบเปเบเบเปเบฒเบฎเปเบญเบเบเป "เบเปเบฒเบญเบดเบเปเบเบทเปเบญเบกเบเปเปเปเบเบทเปเบญเบเบซเบกเบฒเบเปเบซเบผเบปเปเบฒเบเบตเป, เปเบฅเบฐเบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเบเบดเปเบกเบชเบดเปเบเบเบตเปเบเปเปเบฒเบเบฑเบเบเบฑเบเบซเบกเบปเบ, เบเบงเบเบกเบตเบเบฝเบเบญเบฑเบเบเบฝเบงเปเบเบปเปเบฒเบเบฑเปเบ เบเบปเบงเบขเปเบฒเบเบชเปเบฒเบฅเบฑเบเปเบเปเบฅเบฐเบเบฐเปเบ" - เบเบตเปเปเบกเปเบเบงเบดเบเบตเบเบตเปเบกเบฑเบเบเบฐเปเบฎเบฑเบเบงเบฝเบ, เปเบเบดเบเปเบกเปเบเบงเปเบฒเบเบฒเบเปเบเบทเปเบญเบกเบเปเปเบเปเปเบเปเบฒเปเบเบฑเบเบเบฑเบเบซเบกเบปเบ.
เปเบฅเบฐเบเบฒเบเบเบฑเปเบเปเบเบปเปเบฒเปเบเบเบเบตเปเบฅเบฐเบกเบฑเบ "เบเบฝเบเปเบเปเปเบฎเบฑเบเบงเบฝเบ", เบเบฒเบเบเบฑเปเบเบกเบฑเบเบกเบตเบเบปเบเบเบฐเบเบปเบเบเบตเปเบเปเปเบเบตเบเปเปเบเบฒเบเบเบฐเบเบดเบเบฑเบ, เปเบฅเบฐเบเบฒเบเบเบฑเปเบเบกเบฑเบเบเปเปเปเบซเปเบเบปเบเบเบฐเบเบปเบเบเบตเปเบเปเปเบเบฒเบเบเบดเบเบขเปเบฒเบเบชเบปเบกเบเบนเบเบเบฒเบเบเบฑเบเบชเบฐเบเบฐเบเบญเบเบเบนเปเบเบฑเบเบเบฐเบเบฒ.
เบเบต, เบญเบฒเบเบเบฐเบเปเปเบเบฐเบเบฑเบเปเบเบซเบผเบฒเบ, เปเบเป ...
โเบเบนเปเบฎเบฑเบโ: เปเบเบปเปเบฒเบฎเปเบงเบก + เบเบงเบฒเบกเปเบเบเบเปเบฒเบ
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-record เบเบปเบงเบเบญเบเบกเบฑเบเปเบญเบ.
Nested เบกเบตเบขเบนเป
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: เบเบฑเบเบเบถเบเบเบตเปเบซเบฒเบเบฒเบเบเบฐเบกเบฒเบฎเบญเบเบเบฒเบเบเบญเบเบเบฒเบเปเบเบปเปเบฒเบฎเปเบงเบก" .
โเปเบเบฑเบเบซเบเบฑเบเบเปเบญเบเบเปเบฒเบเบซเบผเบฒเบโ: 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 implicit
เบชเบดเปเบเบเบตเปเบเปเบฒเบเบเบทเบเบฑเบเปเบเบตเบเบเบถเปเบเบขเบนเปเปเบเบเบเปเบฒเบเบเบฑเบ เบเบฒเบเบเบงเบเบชเบญเบเบเบงเบฒเบกเบเปเปเบซเบงเปเบฒเบเปเบเบปเปเบฒ เบชเบฑเบเบเบฒเบ เบซเบผเบท CTEs เปเบกเบทเปเบญเบเบฒเบเบฎเปเบญเบเบเปเบเบณเปเบเบตเบเปเบ:
...
CASE
WHEN (
SELECT
count(*)
FROM
X
LIMIT 1
) = 0 THEN ...
เบเบฑเบเบเบฑเบเบฅเบงเบก (count/min/max/sum/...
) เบเบทเบเบเบฐเบเบดเบเบฑเบเบขเปเบฒเบเบชเปเบฒเปเบฅเบฑเบเบเบปเบเปเบเบเบธเบเบเบฑเบเบซเบกเบปเบ, เปเบเบดเบเปเบกเปเบเบงเปเบฒเบเปเปเบกเบตเบเปเบฒเปเบเบฐเบเปเบฒเบเบตเปเบเบฑเบเปเบเบ GROUP BY
. เบเบฝเบเปเบเปเบเบฑเบ 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 เบเบญเบเบเปเบฒเบเบตเปเปเบเบเบเปเบฒเบเบเบฑเบเบเปเบฒเบญเบดเบเบเบตเปเปเบเบปเปเบฒเบกเบฒ.
เบเบฒเบเบเบฑเปเบเปเบเบญเบฐเบเบฒเบเบปเบเบเบตเปเบญเบฒเบเบเบฐเปเบฅเบฐเบเบฐเปเบฎเบฑเบเบงเบฝเบเบเปเบเบญเบเปเบเบเบฑเบ node เปเบซเบกเป เบเบฑเบเบเบฐเบเบตเบเปเบฒเบกเบเบฒเบเบชเบฐเปเบเบ, เบเบฒเบโเบเบฐโเบเบดโเบเบฑเบโเปเบโเบเบฑเบโเบเบธโเบเบฑเบโเปเบกเปเบโเปเบเปโเบฎเบฑเบโเบเบฒเบโเปเบเปโเปเบโ, เปเบเปโเบเบฑเบโเบเปเปโเบเบฑเบโเปเบเปโ.
เบชเปเบฒเบฅเบฑเบเปเบเบเบฑเบเบเบธเบเบฑเบเบเปเบฒเบญเบดเบ เบเบฑเบเบเบถเบเบเบฑเบเปเบปเบเบเบฐเบเบทเบเบเบถเบเบกเบฒ, เปเบเบฑเบเปเบญเบเบฐเบฅเบฑเบ, เปเบฅเบฐเบเบฝเบเปเบเปเบเบฒเบเบเบงเบเบกเบฑเบเบเบฐเบเปเบฒเบเบงเบเบเบตเปเบฎเปเบญเบเบเปเบเบทเบ. เบกเบฑเบเปเบเบฑเบเบชเบดเปเบเบเบตเปเปเบชเบเปเบชเบปเปเบฒเปเบเบเบชเบฐเปเบเบฒเบฐเบเปเบฒเบเบงเบเปเบฎเบปเบฒเบเปเบญเบเบเบฒเบเบเบฒเบเบชเบดเปเบเบเบฒเบเบขเปเบฒเบเปเบเบฑเปเบ: $ 1 = 4, เปเบฅเบฐเบกเบตเบซเบผเบฒเบเบฎเปเบญเบเบเบฑเบเบเบฑเบเบเบถเบเบขเบนเปเปเบเบเบฒเบเบฐเบฅเบฒเบ ...
เปเบเบเปเบฒเบชเบฑเปเบเบเบตเปเบเบฐเบเปเปเปเบชเบเปเบเปเบ vain, เปเบซเปเปเบฎเบปเบฒเปเบเปเบเบฒเบเบชเบญเบเบเบฒเบก recursive
เปเบซเบผเปเบเบเปเปเบกเบนเบ: www.habr.com