I roto i te SQL, ka whakaahua koe "he aha" e hiahia ana koe ki te tiki, kaua "me pehea" me mahi. Na reira, ko te raruraru o te whakawhanake i nga patai SQL i roto i te ahua o te "i te mea e rongohia ana ko te ahua o te tuhi" ka noho hei honore, me te nga ahuatanga o te aromatawai ahuatanga i roto i te SQL.
I tenei ra, ma te whakamahi i nga tauira tino ngawari, kia kite tatou he aha tenei ka puta i roto i te horopaki o te whakamahi GROUP/DISTINCT и LIMIT me ratou.
Mena i tuhi koe i roto i te tono "Tuatahi honoa enei papa, katahi ka maka atu nga taarua katoa, kia kotahi anake tauira mo ia kī" - koinei tonu te mahi, ahakoa kaore i hiahiatia te hononga.
A i etahi wa ka waimarie koe, ka "mahi noa", i etahi wa ka pa te kino ki te mahi, a, i etahi wa ka puta nga hua kaore i tino whakaarohia mai i te tirohanga a te kaiwhakawhanake.
Ana, kaore pea i te mea whakamiharo, engari ...
"Sweet couple": JOIN + DISTINCT
SELECT DISTINCT
X.*
FROM
X
JOIN
Y
ON Y.fk = X.pk
WHERE
Y.bool_condition;
Me pehea e marama ai ta ratou i hiahia ai tīpakohia nga rekoata X kei roto i a Y e hono ana ki te ahuatanga kua tutuki. I tukuna he tono ma JOIN - he maha nga wa i whiwhi ai koe i etahi uara o te pk (e hia nga rekoata tika i puta ki Y). Me pehea te tango? He pono DISTINCT!
He mea "ahuareka" mena he maha nga rau rekoata Y mo ia rekoata X, katahi ka nekehia nga taarua ...
Me pehea te whakatika? Hei timata, kia mohio koe ka taea te whakarereke i te mahi "Tīpakohia aua rekoata X kei reira KO TE KOTAHI i roto i te Y e pa ana ki te ahuatanga e tutuki ana" - i muri i nga mea katoa, kaore matou e hiahia ki tetahi mea mai i te rekoata Y ano.
Kohanga TARI
SELECT
*
FROM
X
WHERE
EXISTS(
SELECT
NULL
FROM
Y
WHERE
fk = X.pk AND
bool_condition
LIMIT 1
);
Ko etahi o nga putanga o PostgreSQL e mohio ana kei roto i te EXISTS he nui ki te kimi i te rekoata tuatahi ka puta, kaore nga mea tawhito e kitea. Na reira, pai ake ahau ki te tohu i nga wa katoa LIMIT 1 i roto EXISTS.
KAUPAPA KAUPAPA
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;
Ko tetahi atu painga o enei huringa patai ko te kaha ki te whakawhāiti i te tatauranga o nga rekoata mena ka hiahiatia kia kotahi anake, penei i te keehi e whai ake nei:
SELECT DISTINCT ON(X.pk)
*
FROM
X
JOIN
Y
ON Y.fk = X.pk
LIMIT 1;
Inaianei ka panuihia e matou te tono me te ngana ki te mohio he aha te mahi a te DBMS:
ka honoa e matou nga papa
ahurei na X.pk
whiriwhiria tetahi o nga rekoata e toe ana
Na he aha i whiwhi koe? "Kotahi rekoata" mai i nga mea ahurei - a ki te tangohia e koe tetahi o nga mea ahurei, ka rereke te hua? .. "A ki te kore he rereke, he aha te utu nui atu?"
SELECT
*
FROM
(
SELECT
*
FROM
X
-- сюда можно подсунуть подходящих условий
LIMIT 1 -- +1 Limit
) X
JOIN
Y
ON Y.fk = X.pk
LIMIT 1;
A tino rite te kaupapa ki GROUP BY + LIMIT 1.
"Me patai noa ahau": implicit GROUP + LIMIT
He rite nga mea ka puta i nga momo rereke arowhai korekore tapanga, CTE ranei i te wa e haere ana te tono:
...
CASE
WHEN (
SELECT
count(*)
FROM
X
LIMIT 1
) = 0 THEN ...
Nga mahi whakahiato (count/min/max/sum/...) ka mahia paitia i runga i te huinga katoa, ahakoa me te kore e tino whakaatu GROUP BY. Ko konei anake me LIMIT e kore ratou e tino hoa.
Ka taea e te kaiwhakawhanake te whakaaro "Na, mena he rekoata kei reira, katahi ka hiahia au kia nui ake i te LIMIT". Engari kaore koe e whai! No te mea mo te turanga:
tatauhia ta ratou e hiahia ana i runga i nga rekoata katoa
hoatu te maha o nga rarangi ka tonoa
I runga i nga ahuatanga o te whaainga, he mea tika ki te whakarereke i tetahi o nga mea e whai ake nei:
(count + LIMIT 1) = 0i runga iNOT EXISTS(LIMIT 1)
(count + LIMIT 1) > 0i runga iEXISTS(LIMIT 1)
count >= Ni runga i(SELECT count(*) FROM (... LIMIT N))
"E hia te nui o te iri i roto i nga karamu": DISTINCT + LIMIT
SELECT DISTINCT
pk
FROM
X
LIMIT $1
Ko te kaiwhakawhanake maamaa ka whakapono pono ka mutu te tono tono, ka kitea e matou nga uara rereke $1 tuatahi ka puta.
I etahi wa kei te heke mai, tera pea ka mahi tenei na te mea he node hou Taupū Tīpoka Matawai, ko te whakatinanatanga kei te mahia i tenei wa, engari kaore ano.
I tenei wa tuatahi ka tangohia nga rekoata katoa, he mea ahurei, a ko te maha o ratou i tonoa ka whakahokia mai. He tino pouri ki te hiahia tatou ki tetahi mea penei $ 1 = 4, a he rau mano nga rekoata kei te ripanga ...