2017-01-09 4 views
0

Ich habe eine Tabelle mit drei Feldern zu erhalten, sieht wie folgt aus ...........Abfrage scheint nicht die richtigen Ergebnisse

tblValues 

NameFrom   NameTo   Difference 
abbbb    arrrr    16 
acccc    agggg    20 
adddd    annnn    17 

Meine Frage wie folgt aussieht ...

Select 'From' = tblValues.NameFrom, 
     'To' = tblValues.NameTo, 
     TblValues.Difference, 
     'Other' = x1.Difference 
from tblValues 
    LEFT JOIN tblValues X1 
    ON tblValues.NameFrom = X1.NameTo 
    AND tblValues.NameTo = X1.NameFrom 
WHERE tblValues.NameFrom Like '%a%' OR tblValues.NameTo Like '%a%' 
ORDER BY tblValues.NameFrom, tblValues.NameTo 

Ich ließ Benutzer einen Textwert in diesem Fall 'a' suchen. Ich habe etwa 30000 Werte, die von niemandem bearbeitet/aktualisiert werden. Sie wurden in diese Tabelle eingegeben und waren so wie sie sind.

Die Daten wie folgt aussieht ....

From  To   Difference  Other 
abbbb  arrrr  16    16 
....  .... 
'Same for all the values - or at least that's what it should be! 

Das Problem, das ich habe ist, dass, wenn ich diese Abfrage ausführen gibt es ein paar Datensätze, bei denen ANDERE = NULL - obwohl Differenz einen Wert hat. Irgendeine Idee warum?

+0

Ich weiß, das kann einfach eine andere Art und Weise durchgeführt werden - aber diese Abfrage wurde geschrieben von jemand anderem und während ich es nicht ändern wollen - ich will wissen, warum es nicht nachgibt den gültigen Daten (NULL-Werte) – BobSki

Antwort

2

Sie den Wert other mit dieser Linie Kommissionierung

LEFT JOIN tblValues X1 ON tblValues.NameFrom = X1.NameTo 

Und Sie zeigen es mit diesem:

'Other' = x1.Difference 

Ein LEFT JOIN bedeutet: beitreten diese Tabelle. Wenn es keinen verbundenen Datensatz gibt, geben Sie NULL zurück. Wenn es eines gibt (oder wenn es mehr als eins gibt), kehren Sie mit allen zurück.

Für Ihre Abfrage, wo Sie die gleiche Tabelle wie die Quelltabelle anschließen, bedeutet das:

Immer, wenn es keine Aufzeichnungen gefunden ist, wo tblValues.NameFrom = X1.NameTo dieses Feld other NULL bleiben ... Warum dies kann niemand geschieht sagen Sie von außen ...

1

Es sieht so aus, als ob Sie LEFT JOIN zu JOIN ändern möchten. Hier finden Sie eine grafische Erklärung der SQL Joins: https://stackoverflow.com/a/406333/2054629.

verbinden Grundsätzlich Mittel links

  • alle Zeilen aus Tabelle A
  • passende Zeilen der Tabelle B, falls gefunden, sonst NULL
1

Ihre Ergebnisse aus der X1-Tabelle sind NULL, wenn es keine entsprechenden NameTo-Werte für die Tabelle tblValues ​​NameFrom gibt. Der linke Join enthält alle Datensätze aus tblValues, auch wenn in X1 keine entsprechenden Übereinstimmungen vorhanden sind. Verwenden Sie ein INNER JOIN:

Select 'From' = tblValues.NameFrom, 'To' = tblValues.NameTo, TblValues.Difference, 'Other' = x1.Difference 
from tblValues 
INNER JOIN tblValues X1 ON tblValues.NameFrom = X1.NameTo 
AND tblValues.NameTo = X1.NameFrom 
WHERE tblValues.NameFrom Like '%a%' OR tblValues.NameTo Like '%a%' 
ORDER BY tblValues.NameFrom, tblValues.NameTo 
Verwandte Themen