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 เชฎเซเชฒเซเชฏเซ เชฎเชณเซเชฏเชพ (เชตเชพเชฏ เชฎเชพเช เชเซเชเชฒเซ เชฏเซเชเซเชฏ เชเชจเซเชเซเชฐเซเช เชฆเซเชเชพเช). เชเซเชตเซ เชฐเซเชคเซ เชฆเซเชฐ เชเชฐเชตเซเช? เชเซเชเซเชเชธ DISTINCT
!
เชคเซ เชเชพเชธ เชเชฐเซเชจเซ "เชชเซเชฐเชธเชจเซเชจเชคเชพ" เชเซ เชเซเชฏเชพเชฐเซ เชฆเชฐเซเช เชเชเซเชธ-เชฐเซเชเซเชฐเซเชก เชฎเชพเชเซ เชเชฃเชพ เชธเซ เชธเชเชฌเชเชงเชฟเชค Y-เชฐเซเชเซเชฐเซเชกเซเชธ เชนเซเชฏ เชเซ, เช
เชจเซ เชชเชเซ เชกเซเชชเซเชฒเชฟเชเซเชเซเชธ เชตเซเชฐเชคเชพเชชเซเชฐเซเชตเช เชฆเซเชฐ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ...
เชเซเชตเซ เชฐเซเชคเซ เช เซเช เชเชฐเชตเซเช? เชถเชฐเซ เชเชฐเชตเชพ เชฎเชพเชเซ, เชธเชฎเชเซ เชเซ เชธเชฎเชธเซเชฏเชพเชฎเชพเช เชซเซเชฐเชซเชพเชฐ เชเชฐเซ เชถเชเชพเชฏ เชเซ "เชเชเซเชธ เชฐเซเชเซเชฐเซเชก เชชเชธเชเชฆ เชเชฐเซ เชเซ เชเซเชจเชพ เชฎเชพเชเซ Y เชฎเชพเช เชเชเชพเชฎเชพเช เชเชเซ เชเช เชชเชฐเชฟเชชเซเชฐเซเชฃ เชถเชฐเชค เชธเชพเชฅเซ เชธเชเชเชณเชพเชฏเซเชฒ เชเซ" - เชเซเชตเชเซ, เช
เชฎเชจเซ Y-เชฐเซเชเซเชฐเซเชกเชฎเชพเชเชฅเซ เช เชเชเชเชชเชฃเชจเซ เชเชฐเซเชฐ เชจเชฅเซ.
เชจเซเชธเซเชเซเชก เช เชธเซเชคเชฟเชคเซเชตเชฎเชพเช เชเซ
SELECT
*
FROM
X
WHERE
EXISTS(
SELECT
NULL
FROM
Y
WHERE
fk = X.pk AND
bool_condition
LIMIT 1
);
PostgreSQL เชจเชพ เชเซเชเชฒเชพเช เชธเชเชธเซเชเชฐเชฃเซ เชธเชฎเชเซ เชเซ เชเซ เช
เชธเซเชคเชฟเชคเซเชตเชฎเชพเช เชเซ เชคเซ เชชเซเชฐเชฅเชฎ เชเชจเซเชเซเชฐเซ เชถเซเชงเชตเชพ เชฎเชพเชเซ เชชเซเชฐเชคเซเช เชเซ เชเซ เชเชตเซ เชเซ, เชเซเชจเซ เชฒเซเชเซ เชจเชฅเซ. เชคเซเชฅเซ เชนเซเช เชนเชเชฎเซเชถเชพ เชธเซเชเชตเชตเชพเชจเซเช เชชเชธเชเชฆ เชเชฐเซเช เชเซเช 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 [เชเชพเชฒเซ] + เชฎเชฐเซเชฏเชพเชฆเชพ 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