Как получить значения в 1 строке вместо нескольких строк в SQL - PullRequest
1 голос
/ 23 ноября 2011

У меня есть таблица, в которой отображаются все названия предметов и их коды предметов.

TableItem

ItemID, ItemName
772729918, 'ABC'
772729921, 'BCD'
772729922, 'EFG'
772729923, 'HIJ'
772729926, 'KLM'

У меня есть другая таблица, в которой определены пути к изображениям элементов.

TableImages

itemimageID, Imagesurface,ImagePath, fitemID
111,'FRONT', '772729918_1_1_FRONT.tif', 772729918
112,'BACK', '772729918_1_1_BACK.tif',772729918
222,'FRONT','772729921_1_1_FRONT'.tif,772729921
223,'BACK','772729921_1_1_BACK.tif',772729921
333,'FRONT','772729922_1_1_FRONT.tif',772729922
332,'BACK', '772729922_1_1_BACK.tif',772729922
444,'FRONT','772729923_1_1_FRONT.tif',772729923
442,'BACK', '772729923_1_1_BACK.tif',772729923
555,'FRONT','772729926_1_1_FRONT.tif',772729926
552,'BACK', '772729926_1_1_BACK.tif',772729926

Если я присоединюсь к этим двум таблицам, я получу значения, как показано ниже.

Выберите ItemID, ItemName, Imagesurface, ImagePath из TableItem i внутреннее соединение TableImages ti on ti.fitemID = i.ItemID

772729918,'ABC','FRONT','772729918_1_1_FRONT.tif'
772729918,'ABC','BACK','772729918_1_1_BACK.tif'
772729921,'BCD','FRONT','772729921_1_1_FRONT.tif'
772729921,'BCD','BACK','772729921_1_1_BACK.tif'
772729922,'EFG','FRONT','772729922_1_1_FRONT.tif'
772729922,'EFG','BACK','772729922_1_1_BACK.tif'
772729923,'HIJ','FRONT','772729923_1_1_FRONT.tif'
772729923,'HIJ','BACK','772729923_1_1_BACK.tif'
772729926,'KLM','FRONT','772729926_1_1_FRONT.tif'
772729926,'KLM','BACK','772729926_1_1_BACK.tif'

На самом деле я хочу показать их в одной строке вместо 2 строк для каждого элемента. Спасибо за помощь.

ItemID, ItemName, ImageSurface, ImageFront, ImageBack
772729918,'ABC','FRONT','772729918_1_1_FRONT.tif','772729918_1_1_BACK.tif'
772729921,'BCD','FRONT','772729921_1_1_FRONT.tif','772729921_1_1_BACK.tif'
772729922,'EFG','FRONT','772729922_1_1_FRONT.tif','772729922_1_1_BACK.tif'
772729923,'HIJ','FRONT','772729923_1_1_FRONT.tif','772729923_1_1_BACK.tif'
772729926,'KLM','FRONT','772729926_1_1_FRONT.tif','772729926_1_1_BACK.tif'

Ответы [ 4 ]

4 голосов
/ 23 ноября 2011
SELECT itemid, 
       itemname, 
       imagesurface, 
       fti.imagepath AS imagefront, 
       bti.imagepath AS imageback 
FROM   tableitem i 
       LEFT JOIN tableimages fti 
         ON fti.fitemid = i.itemid 
            AND fti.imagesurface = 'FRONT' 
       LEFT JOIN tableimages bti 
         ON bti.fitemid = i.itemid 
            AND fti.imagesurface = 'BACK' 
2 голосов
/ 23 ноября 2011

Вот как работает INNER JOIN ... поскольку у вас есть несколько строк, которые соответствуют вашему условию соединения, вы также получите несколько строк в наборе результатов.

Вы можете получить то, что хотите, используя подзапросы.

SELECT   ItemId
        ,ItemName
        --,(SELECT TOP 1 ImageSurface FROM TableImages WHERE fItemId = ItemId)
        ,(SELECT TOP 1 ImagePath FROM TableImages WHERE fItemId = ItemId AND ImageSurface = 'FRONT') ImageFront
        ,(SELECT TOP 1 ImagePath FROM TableImages WHERE fItemId = ItemId AND ImageSurface = 'BACK') ImageBack
FROM    TableItem

Обратите внимание, что я закомментировал поле ImageSurface, потому что оно казалось ненужным.

0 голосов
/ 23 ноября 2011

Вам нужно сделать то, что называется "опорой". Вот пример:

SELECT pivottable.* FROM
(
  Select ItemID,ItemName, Imagesurface,ImagePath from TableItem i inner join TableImages ti on ti.fitemID = i.ItemID 
) as baseTable
PIVOT
(
min(imagepath) for ImageSurface in ( [FRONT],[BACK] )
) as pivottable
0 голосов
/ 23 ноября 2011

Попробуйте левое соединение вместо внутреннего соединения

Select i.ItemID, i.ItemName, ti.Imagesurface, ti.ImagePath 
from TableItem i Left join TableImages ti     
on ti.fitemID = i.ItemID

Сюда будут включены все элементы из левой таблицы и сопоставлены все элементы правой таблицы с идентификатором, если они существуют.NULL, если они не

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...