Имрӯз, бо истифода аз мисолҳои хеле содда, биёед бубинем, ки ин метавонад дар заминаи истифода ба чӣ оварда расонад 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 чизе лозим нест.
Ҷойгиршуда вуҷуд дорад
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;
...
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