2017-02-23 3 views
2

existieren Angenommen, dass wir einen Tisch Users haben, die über BenutzerSQL erhalten Daten aus der Tabelle nur, wenn sie nicht in einer anderen Tabelle

UserId FirstName LastName 
    1  Maria  Anders 
    2  Ana   Trujillo 
    3  Antonio  Moreno 
    4  Thomas  Hardy 
    5  Christina Berglund 
    6  Hanna  Moos 
    7  Frédérique Citeaux 
    8  Martín  Sommer 

haben wir zwei Tabellen Details und Exception grundlegende Informationen speichern, die zusätzlichen Details speichern über Benutzer, tatsächlich haben beide Tabellen die gleiche Struktur

Details Tisch

UserId Age 
1  10 
2  10 
3  10 
4  40 
5  50 
6  60 
7  70 
8  80 

Excpetions Tisch

UserId Age 
1  100 
2  100 
3  100 

ich Abfrage schreiben möchten alle Details über die Benutzer von Exceptions und details zu erhalten, wenn der Benutzer Informationen in der exceptions Tabelle gespeichert hat es sonst in details Tabelle gespeicherten Daten überschreiben, sollten die Daten aus details erhalten Tisch, so sollte das Ergebnis

UserId FirstName LastName Age 
1  Maria   Anders 100 
2  Ana   Trujillo 100 
3  Antonio  Moreno 100 
4  Thomas   Hardy 40 
5  Christina Berglund 50 
6  Hanna   Moos 60 
7  Frédérique Citeaux 70 
8  Martín  Sommer 80 

sein, so in diesem Beispiel Maria, Ana und Antonio mit Ids 1, 2, 3 haben im Alter von 10 in der Tabelle details aber becuase ihre gespeicherten Daten inIn der Tabelle sollte das Ergebnis das Alter 100 anzeigen, für andere Benutzer die keine Informationen in der excpetion Tabelle haben, also bekommen wir einfach die Daten aus der Tabelle details.

tatsächlich kam ich mit einer Lösung, aber ich denke, es gibt bessere Abfrage ich schreiben kann, hier meine Lösung

select u.UserId, u.FirstName , u.LastName , e.Age from Exceptions e 

inner join Users u on u.UserId = e.UserId 

union select u.UserId, u.FirstName , u.LastName , d.Age from Details d 

inner join Users u on u.UserId = d.UserId 

where d.UserId not in (select UserId from Exceptions) 

eine Möglichkeit, diese Unterabfrage zu vermeiden, ist es? können wir es besser machen?

Antwort

4

Sie einen piar nutzen könnten von LEFT JOIN und CASE WHEN (oder einen Scheck für null)

select 
    u.UserId 
, u.FirstName 
, u.LastName 
, CASE WHEN e.Age IS NOT NULL then e.age ELSE d.age END as AGE 
from Users u 
left join Details as d on .UserId = d.UserId 
left join Exceptions e on e.UserId = u.UserId 
+0

gerade eingefügt die genaue Abfrage. aber du bist schneller! – Badiparmagi

+0

@Badiparmagi dann bist du gut in sql .. könntest du die antwort verbessern und dann posten .. (mit isnull .. oder anderen ..) – scaisEdge

+0

danke. vielleicht können Sie einen Alias ​​wie "age" hinzufügen, wenn Sie "no column name" benennen. Gut gemacht. – Badiparmagi

0

Sie verwenden Entity Framework Angenommen, und Sie haben Ihre Fremdschlüssel einrichten:

myDbContext.Users 
.Select(u => new 
{ 
    u.UserId, 
    u.FirstName, 
    u.LastName, 
    Age = u.Exceptions.Any() ? u.Exceptions.FirstOrDefault().Age : u.Details.FirstOrDefault().Age 
}) 
2

Anstatt CASE-Anweisung zu verwenden, habe ich dies mit COALESCE getan.

select 
    u.UserId 
, u.FirstName 
,COALESCE(e.Age,d.age) AGE 
from Users u 
left join Details as d on u.UserId = d.UserId 
left join Exceptions e on e.UserId = u.UserId 
Verwandte Themen