2017-02-22 25 views
0

Я использую соединение для извлечения данных из некоторых таблиц. для 2 столбцов данных, необходимых из запроса соединения, находятся в одном столбце таблицы.Использование соединения для возврата нескольких ячеек данных из того же столбца

Вот что я прямо сейчас:

SELECT [contract_member_brg_attr].field_id, 
     [contract_member_brg_attr].attr_val AS 'properties', 
     [contract_attr].attr_val   AS 'contract_number', 
     [contract_attr].attr_val   AS 'supplier_number' 
FROM [contract_member_brg_attr] 
     INNER JOIN [contract_member_brg] 
       ON [contract_member_brg_attr].item_id = 
        [contract_member_brg].item_id 
     INNER JOIN [contract_attr] 
       ON [contract_attr].item_id = 
        [contract_member_brg].[contract_item_id] 
        AND [contract_attr].field_id = 413 

Это возвращает следующее.

enter image description here

Как вы можете увидеть последние 2 строки возвращаются одни и те же, потому что они происходят из одной и той же колонке, и я только фильтрация по одному из них (413).

Вот где он тянет из():

enter image description here

мне нужны значения от 413 и 234 во 2-м столбце.

Когда я пытаюсь добавить, что я хочу, чтобы фильтровать 234 (OR [CONTRACT_ATTR].field_id = 234) и все, что перерывы:

enter image description here

Что я делаю не так и как это исправить?

+0

На самом деле ни одна из этих строк не отличается. Все они разные. Что вы здесь делаете? –

+0

Вы хотите, чтобы элементы данных из 2 строк отображались как 2 отдельных столбца в вашем конечном результате? Вы использовали таблицу '[contract_attr]' только один раз. 'JOIN' или' LEFT JOIN' снова, используя псевдоним, чтобы получить второй атрибут. – mheptinstall

+0

@SeanLange Во втором изображении вы видите 12/234/A180 и 12/413/b5v5b5b5bb5? Я хочу, чтобы оба из них вошли в столбцы из запроса соединения. –

ответ

2

Вы можете повторно использовать ту же таблицу, дав ему псевдоним в этом примере я назвал его [other_contract_attr] и ограничивая результаты в field_id из 234.

SELECT [contract_member_brg_attr].field_id, 
     [contract_member_brg_attr].attr_val AS 'properties', 
     [contract_attr].attr_val   AS 'contract_number', 
     [other_contract_attr].attr_val   AS 'supplier_number' 
FROM [contract_member_brg_attr] 
     INNER JOIN [contract_member_brg] 
       ON [contract_member_brg_attr].item_id = 
        [contract_member_brg].item_id 
     INNER JOIN [contract_attr] 
       ON [contract_attr].item_id = 
        [contract_member_brg].[contract_item_id] 
        AND [contract_attr].field_id = 413 
    INNER JOIN [contract_attr] AS [other_contract_attr] 
       ON [other_contract_attr].item_id = 
        [contract_member_brg].[contract_item_id] 
        AND [other_contract_attr].field_id = 234 

Тем не менее, это выглядит, как вы пытаясь сделать PIVOT строк в столбцах, если вы хотите вернуть несколько строк в столбцы из одной таблицы, было бы лучше: PIVOT ваши значения, как это, и JOIN:

SELECT 
[item_id], 
MAX(CASE WHEN [field_id] = 413 
    THEN [attr_val] 
END) AS [413_val], 
MAX(CASE WHEN [field_id] = 234 
    THEN [attr_val] 
END) AS [234_val], 

FROM 
[contract_attr] 

GROUP BY 
[item_id] 
+0

Отлично, я понимаю сейчас. Благодаря! –

2

Это не ответ на ваш вопрос, но слишком длинный комментарий. Если вы использовали псевдонимы в своих запросах, их было бы легче читать и поддерживать. Вот как будет выглядеть ваш запрос, просто с помощью псевдонимов, а не тех, которые действительно длинны имена таблиц снова и снова.

SELECT mba.field_id, 
     mba.attr_val AS 'properties', 
     ca.attr_val AS 'contract_number', 
     ca.attr_val AS 'supplier_number' 
FROM contract_member_brg_attr mba 
     INNER JOIN contract_member_brg mb 
       ON mba.item_id = 
        mb.item_id 
     INNER JOIN contract_attr ca 
       ON ca.item_id = 
        mb.contract_item_id 
        AND ca.field_id = 413 
+0

Холодные бобы ..: D –

+1

Определенно более дружественный для разработчиков. : P –