2017-02-23 32 views
2

Предположим, что у нас есть таблица Users, которая хранит основную информацию о пользователяхSQL получить данные из таблицы, только если она не существует в другой таблице

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 

у нас есть две таблицы Details и Exception, хранящие дополнительные детали о пользователях, на самом деле обе таблицы имеют одинаковую структуру

Details стол

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

стол

UserId Age 
1  100 
2  100 
3  100 

Я хочу написать запрос, чтобы получить подробную информацию о всех пользователях с Exceptions и details, если пользователь информацией хранится в exceptions таблице следует переопределить данные, хранящиеся в details таблице в противном случае получить данные из details таблица поэтому результат должен быть

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 

так в этом примере Мария, Ана и Антонио с идентификаторами 1, 2, 3 имеют возраст 10 в details таблице, но becuase их данные хранятся в excpetions, результат должен показывать возраст 100, для других пользователей нет информации в таблице excpetion, поэтому мы просто получаем данные из таблицы details.

на самом деле, я придумал решение, но я думаю, что лучше запрос я могу написать, вот мое решение

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) 

есть ли способ избежать этого подзапрос? можем ли мы сделать лучше?

ответ

4

Вы можете использовать Пиар левых присоединиться и случай, когда (или чек на нуль)

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

только что вставил точный запрос. но вы быстрее! – Badiparmagi

+0

@Badiparmagi, тогда вы хороши в sql .. может быть, вы можете улучшить ответ, а затем отправить .. (используя isnull .. или другие ..) – scaisEdge

+0

спасибо. возможно, вы можете добавить псевдоним типа «возраст» в случае имен имен «no column name». отличная работа. – Badiparmagi

0

Предполагая, что вы используете Entity Framework и у вас есть внешние ключи настройки:

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

Вместо использования оператора CASE я сделал это с помощью COALESCE.

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 

 Смежные вопросы

  • Нет связанных вопросов^_^