PostgreSQL Antipatterni: "Solum unum esse oportet!"

In SQL describis quid vis efficere, non quomodo exsecutioni mandari. Itaque quaestio SQL explicandi queries in stilo "sicut auditur quomodo scriptum est" locum obtinet honoris, una cum features de colligendis conditionibus in SQL.

Hodie, exemplis simplicissimis utens, videamus quid hoc in contextu usus efficere possit GROUP/DISTINCT ΠΈ LIMIT cum illis.

Nunc, si scripsisti in petitione Haec signa primum coniunge, deinde omnes duplicates eici; unum tantum sit nam quisque key effingo " - Hoc ipsum quomodo erit labor, etiam si nexus omnino non egeret.

Aliquando autem felix es et " opera iusta " , interdum ingratum effectum in effectu habet , et interdum effectus praebet qui omnino inopinati sunt ex parte elit.

PostgreSQL Antipatterni: "Solum unum esse oportet!"
Bene, fortasse non tam spectaculi, sed ...

"Dulce iugo": JOIN + DISTINCTUS

SELECT DISTINCT
  X.*
FROM
  X
JOIN
  Y
    ON Y.fk = X.pk
WHERE
  Y.bool_condition;

Patet quid volebant selecta monumenta X, pro quibus extant in Y monumenta quae ad conditionem impletam referuntur. Petitio scripsit via JOIN β€” aliquot pk valores aliquotiens obtinuit (quantum prorsus viscus idoneus in Y apparuit). Quomodo auferam? Certe DISTINCT!

Illud praesertim "gratius" est cum pro singulis X-recordibus complura centum Y-recordiones cognata sunt, tum duplicatae heroice tolluntur...

PostgreSQL Antipatterni: "Solum unum esse oportet!"

Quomodo figere? In primis, animadverto problema mutari posse "selectis monumentis X pro quibus in Y est saltem una cum conditione impleta" - tamen, ab ipso Y-recordo nihil egemus.

Neded existit

SELECT
  *
FROM
  X
WHERE
  EXISTS(
    SELECT
      NULL
    FROM
      Y
    WHERE
      fk = X.pk AND
      bool_condition
    LIMIT 1
  );

Aliquae versiones PostgreSQL intellegunt in EXISTERE satis esse primum ingressum qui subit, antiquiores non invenire. Malo igitur semper indicare LIMIT 1 in EXISTS.

LATERALIS JOIN'

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;

Eadem optio permittit, si opus est, aliquas notitias ex repertis Y-recordibus adiunctis statim reddere. Similis optio tractata est in articulo "PostgreSQL Antipatterns: rarum recordum medium coniunget".

"Cur plura": DISTINC. [DE] + LIMIT 1 .

Accessit utilitas talis transformationis inquisitionis facultas facile inquisitionem monumentorum circumscribere, si una tantum vel pauca exigantur, ut in casu sequenti:

SELECT DISTINCT ON(X.pk)
  *
FROM
  X
JOIN
  Y
    ON Y.fk = X.pk
LIMIT 1;

Nunc rogationem legimus et conamur intellegere quidnam facere proponatur DBMS;

  • connectens signa
  • unique by X.pk
  • ex reliquis viscus unum

Quid ergo habebatis? "Sicut unum ingressum" ex singularibus, et si accipiamus hoc unum ex non-unis, quodammodo mutabitur?

SELECT
  *
FROM
  (
    SELECT
      *
    FROM
      X
    -- сюда ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΡΡƒΠ½ΡƒΡ‚ΡŒ подходящих условий
    LIMIT 1 -- +1 Limit
  ) X
JOIN
  Y
    ON Y.fk = X.pk
LIMIT 1;

Et eodem prorsus argumento est GROUP BY + LIMIT 1.

"Ego iustus have ut rogare": implicita GROUP + LIMIT

Similia occurrunt in diversis non vanitas checks signa CTEs ad petitionem proficit;

...
CASE
  WHEN (
    SELECT
      count(*)
    FROM
      X
    LIMIT 1
  ) = 0 THEN ...

Subgenera munera (count/min/max/sum/...) feliciter exercentur in universo statuto, etiam sine instructionibus expressis GROUP BY. Tantum cum LIMIT non sunt amicissimi.

In elit potest cogitare "Si ibi sunt monumenta, non opus est mihi plus quam FINIS".. Sed hoc ne feceris! Quia turpe est;

  • numerare quod volunt secundum omnes records
  • totidem quot petierint

Secundum scopum conditionibus, unum ex sequentibus substitutionibus opportunum est facere;

  • (count + LIMIT 1) = 0 on NOT EXISTS(LIMIT 1)
  • (count + LIMIT 1) > 0 on EXISTS(LIMIT 1)
  • count >= N on (SELECT count(*) FROM (... LIMIT N))

"Quantum in P. pendere": DISTINCTUS + LIMIT

SELECT DISTINCT
  pk
FROM
  X
LIMIT $1

Simplex elit potest sincere credere postulationem exsecutioni mandare desinet. quam primum invenimus $1 primi valorum diversorum occurrentium.

Aliquando in futuro hoc potest et in novo nodo operabitur Index Skip Scansed nondum est exsecutio quae actu exercetur.

Nunc primum Omnes records et insanabilessingularia sunt, et ab eis tantum quantum petitum est. Maxime tristis est si aliquid simile vellemus 1 4 = $et sunt centena milia monumentorum in mensa.

Ne frustra tristari, interrogatione recursiva utamur "Distinctum pauperibus" e PostgreSQL Wiki:

PostgreSQL Antipatterni: "Solum unum esse oportet!"

Source: www.habr.com