Как объединить два запроса на выборку в одну таблицу - PullRequest
0 голосов
/ 01 апреля 2011

Привет У меня есть два запроса на выборку, и я хочу объединить их в одну таблицу с 5 столбцами как Id, ClientId, Height, EyeColor, HairColor

Запросы:

SELECT ClientCharacteristic.Id
     , ClientCharacteristic.ClientId
     , ClientCharacteristic.Height
     , GeneralLookup.LookupItem as EyeColor  
FROM dbo.ClientCharacteristic
  INNER JOIN dbo.GeneralLookup
    ON GeneralLookup.Id=ClientCharacteristic.glEyeColorId 



SELECT ClientCharacteristic.Id
     , ClientCharacteristic.ClientId
     , ClientCharacteristic.Height
     , GeneralLookup.LookupItem as HairColor  
FROM dbo.ClientCharacteristic
  INNER JOIN dbo.GeneralLookup
    ON GeneralLookup.Id=ClientCharacteristic.glHairColorId

Ответы [ 5 ]

6 голосов
/ 01 апреля 2011

Как правило, вы бы использовали UNION для "объединения" запросов. Однако в данном конкретном случае это приведет к тому, что один столбец будет содержать как EyeColor, так и HairColor между дублированными строками. Я сомневаюсь, что вы этого хотите. Лучше всего использовать псевдоним вашей объединенной таблицы, чтобы вы могли присоединиться к ней дважды:

SELECT
  ClientCharacteristic.Id,
  ClientCharacteristic.ClientId, 
  ClientCharacteristic.Height,
  EyeLookup.LookupItem as EyeColor,
  HairLookup.LookupItem as HairColor
FROM
  dbo.ClientCharacteristic
  INNER JOIN dbo.GeneralLookup AS EyeLookup
    ON EyeLookup.Id=ClientCharacteristic.glEyeColorId
  INNER JOIN dbo.GeneralLookup AS HairLookup
    ON HairLookup.Id=ClientCharacteristic.glHairColorId

Ключевым моментом, на который следует обратить внимание, является предложение AS в предложениях INNER JOIN, в котором псевдоним объединяется в таблице для остальной части запроса. Это позволяет вам присоединяться к одной и той же таблице несколько раз на разных ключах, чтобы на нее можно было ссылаться для разных целей.

5 голосов
/ 01 апреля 2011

union или union all должны делать это, пока столбцы выстраиваются в линию и имеют одинаковый тип (или могут быть неявно преобразованы)

Следуя совету Дэвидса и перечитав вопрос 5 столбцы будут

SELECT ClientCharacteristic.Id, 
       ClientCharacteristic.ClientId,  
       ClientCharacteristic.Height, 
       Eye.LookupItem as EyeColor
       Hair.LookupItem AS HairColor
FROM 
    dbo.ClientCharacteristic 
INNER JOIN 
    dbo.GeneralLookup Eye
    ON  Eye.Id=ClientCharacteristic.glEyeColorId     
INNER JOIN
    dbo.GeneralLookup Hair
    ON Hair.Id=ClientCharacteristic.glHairColorId 
1 голос
/ 01 апреля 2011
SELECT ClientCharacteristic.Id, ClientCharacteristic.ClientId, ClientCharacteristic.Height, GeneralLookup.LookupItem as EyeColor, '' as HairColor    
FROM dbo.ClientCharacteristic INNER JOIN dbo.GeneralLookup ON GeneralLookup.Id=ClientCharacteristic.glEyeColorId
UNION
SELECT ClientCharacteristic.Id, ClientCharacteristic.ClientId, ClientCharacteristic.Height, '' as EyeColor, GeneralLookup.LookupItem as HairColor    
FROM dbo.ClientCharacteristic INNER JOIN dbo.GeneralLookup ON GeneralLookup.Id=ClientCharacteristic.glHairColorId
1 голос
/ 01 апреля 2011

Вы можете использовать UNION для объединения двух запросов в один.

0 голосов
/ 01 апреля 2011

Вы можете использовать оператор de UNION следующим образом:

SELECT ClientCharacteristic.Id, ClientCharacteristic.ClientId, ClientCharacteristic.Height, GeneralLookup.LookupItem as EyeColor
FROM dbo.ClientCharacteristic INNER JOIN dbo.GeneralLookup ON GeneralLookup.Id=ClientCharacteristic.glEyeColorId
UNION
SELECT ClientCharacteristic.Id, ClientCharacteristic.ClientId, ClientCharacteristic.Height, GeneralLookup.LookupItem as HairColor
FROM dbo.ClientCharacteristic INNER JOIN dbo.GeneralLookup ON GeneralLookup.Id=ClientCharacteristic.glHairColorId

Обратите внимание, что оператор UNION отбрасывает дублирующиеся кортежи.Чтобы сохранить повторяющиеся значения в результирующей таблице, используйте UNION ALL.

...