Ethvert udtryk i SQL må kun referere til kolonner i én række (spærer underforespørgsler).
En JOIN
kan bruges til at lave to forskellige rækker til én række i resultatsættet.
Så du kan sammenligne værdier på forskellige rækker ved at lave en selv-join. Her er et eksempel, der viser sammenføjning af hver række til hver anden række, der er knyttet til den samme klient (undtagen en sammenføjning af en række til sig selv):
VÆLG c1.*, c2.*FRA klient c1JOIN klient c2 TIL (c1.clientID =c2.clientID OG c1.id <> c2.id)
Nu kan du skrive udtryk, der sammenligner kolonner. For eksempel for at begrænse ovenstående forespørgsel til dem, hvor felt1 adskiller sig:
VÆLG c1.*, c2.*FRA klient c1JOIN klient c2 TIL (c1.clientID =c2.clientID OG c1.id <> c2.id)HVOR c1.field1 <> c2.field1;
Du angiver ikke, hvilke slags sammenligninger du skal lave, så det overlader jeg til dig. Det vigtigste er, at du generelt kan bruge en selv-join til at sammenligne rækker i en given tabel.
Vedrørende dine kommentarer og præcisering:Okay, så din "forskel" er ikke blot ved værdi, men ved ordensplacering af rækken. Husk, at relationsdatabaser ikke har et koncept for rækkenummer, de har kun rækkefølge i forhold til en rækkefølge, du skal angive i en ORDER BY
klausul. Forveksle ikke "id
" pseudotast med rækkenummer, tallene tildeles som monotont stigende kun ved et tilfælde af deres implementering.
I MySQL kan du drage fordel af brugerdefinerede variabler for at opnå den effekt, du leder efter. Bestil forespørgslen efter clientId
og derefter med id
, og spor værdier pr. kolonne i MySQL-brugervariabler. Når værdien i en aktuel række adskiller sig fra værdien i variablen, skal du gøre hvad du vil fremhæve. Jeg viser et eksempel for et felt:
SET @clientid =-1, @field1 ='';SELECT id, clientId, field1, @clientid, @field1, IF(@clientid <> clientid, ((@clientid :=clientid) AND ( @field1 :=field1)) =NULL, IF (@field1 <> field1, (@field1 :=field1), NULL ) ) AS field1_changedFROM client CORDER BY clientId, id;
Bemærk, at denne løsning ikke er anderledes end blot at vælge alle rækker med almindelig SQL og spore værdierne med applikationsvariabler, mens du henter rækker.