sql >> Database teknologi >  >> RDS >> Mysql

Sammenligning af rækker i tabel for forskelle mellem felter

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.




  1. Brug af Oracle JDeveloper med MySQL-databasetjeneste på Oracle Cloud Platform, del 1

  2. MySQL Trigger:Slet fra tabel EFTER SLETT

  3. MariaDB JSON_INSERT() Forklaret

  4. Forbinder Heroku til RDS ved hjælp af MySql2