SQL: Indirekte JOIN på tættest værdi

Dette er et eksempel på hvordan man kan tilknytte de data fra en tabel, der ligger tættest på data fra en anden.

Idéen er at vi udtager oplysninger om en råvare fra en tabel. Oplysninger om færdigvaren udtager vi fra en anden tabel fra kontrolvægten, som vejer den færdige vare. Vi udtager færdigvarenummeret fra kontrolvægten så kort tid efter den tid, hvor råvaren er registreret, som muligt.

Query’et ses nedenfor – forklaring følger.

  1. SELECT 
  2.    lager.datotid
  3.    lager.halvfabrikata, 
  4.    (SELECT TOP 1 cw.fv 
  5.       FROM checkweight cw 
  6.       WHERE cw.datotid BETWEEN lager.datotid AND '2014-10-10' 
  7.       ORDER BY lager.datotid DESC
  8.    ) AS 'Færdigvare' 
  9. FROM
  10.    lagerforbrug lager
  11. WHERE 
  12.    lager.datotid BETWEEN '2014-10-01' AND '2014-10-10'

Det, der egentlig er interessant i dette query, er linje 4-8, hvor færdigvarenummeret hentes. SELECT TOP 1 betyder at vi kun ønsker det første resultat, der findes. Vi vælger at begrænse til det tidinterval, der er fra den aktuelle datotid (fra råvaren) til maksimum af det tidsinterval, vi kigger på. Dette skyldes at vi kun er interesseret i de færdigvarer, der er registreret efter råvaren er registreret. Til sidst sorterer vi efter tiden, så det første færdigvarenummer der findes, er det der er registreret kortest tid efter råvaren.

Bemærk at det oftest ikke er en god idé at bruge indirekte JOIN, fordi der vil blive lavet en ny søgning på hver række i din hovedtabel, hvilket kan være temmelig ressourcekrævende. Jeg har blot vurderet det nødvendigt i dette tilfælde, fordi vi laver en indirekte sammenligning – vi søger efter tætteste værdi.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *

Please Do the Math      
 

This site uses Akismet to reduce spam. Learn how your comment data is processed.