2009-08-12 2 views
1

У меня есть таблица (назовем ее main_guys), который выглядит следующим образом:T-SQL Условный Выбор по нескольким таблицам

id, other_item_id, other_item_type, another_column, group_id 

The other_item_type говорит мне, какие дополнительные таблица содержит дополнительную информацию, указанную в other_item_id.

Дополнительные столбцы, требуемые в запросе, зависят от таблицы, указанной other_item_type. Поэтому для other_item_type == 'Type-X' Мне нужно получить значения из столбцов foo и bar из таблицы X. Пока для other_item_type == Type-Y Мне нужно получить значения от столбцов ick and blah от Y table.

В идеальном мире, я смог бы получить что-то вроде:

id, other_item_id, other_item_type, another_column, group_id, foo, bar, ick, blah - со значениями, заполненными в случае необходимости для каждого типа и другие столбцы, нулевой или какой нет, если не требуется.

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

В терминах псевдо-кода ...

// obviously not proper code - just trying to communicate need 
// Note: Need all items from main_guys table - 
// even if main_guys.other_item_type is empty 
select * from main_guys where main_guys.group_id == "12345" 
if main_guys.other_item_type == "Type-X" 
select x.foo, x.bar from x where x.id == main_guys.other_item_id 
else if main_guys.other_item_type == "Type-Y" 
select y.ick, y.bar from y where y.id == main_guys.other_item_id 

Спасибо за любую помощь или предложения.

ответ

1

Вы должны смотреть на LEFT OUTER JOIN s

select * from main_guys MG 
    left outer join X 
     on MG.id=X.other_item_id and other_item_type='Type-X' 

    left outer join Y 
     on MG.id=Y.other_item_id and other_item_type='Type-Y' 
    where MG.group_id = '12345' --not sure why this is text 
+0

К сожалению, база данных, которую я читаю, не находится под моим контролем - таким образом, основанный на строках идентификатор :(... Спасибо за решение. – Gabriel

1

ли вы имеете в виду что-то вроде этого

SELECT mg.id, mg.other_item_id, mg.other_item_type, coalesce(x.ick, y.ick) 
FROM main_guys mg 
    LEFT OUTER JOIN x ON x.id = mg.Other_Item_ID AND mg.Other_Item_Type = 'Type-X' 
    LEFT OUTER JOIN y ON y.id = mg.Other_Item_ID AND mg.Other_Item_Type = 'Type-Y' 

Если я вас правильно понимаю это будет означать, у вас есть ссылка на два (или более) таблиц в одном столбце главной таблицы. Я хотел бы призвать вас, чтобы изменить дизайн главной таблицы, чтобы иметь один столбец имеющий один смысл.

+0

Я думаю, что столбцы id - в противоположном направлении. X, Y имеет other_item_id – pjp

+0

Да, полностью согласен с проблемой дизайна ... грустно - я пользуюсь магазином, который не под моим контролем. Спасибо за решение. – Gabriel

+0

@pjp: не соответствует псевдокоду OP, но учитывая, что он уже принял ваш ответ, вы, вероятно, правы. –

1

Вы могли бы сделать что-то вроде этого:

SELECT m.*, x.*, y.* 
FROM main_guys m 
    LEFT JOIN x ON m.id=x.other_item_id AND m.other_item_type = 'Type-X' 
    LEFT JOIN y ON m.id=y.other_item_id AND m.other_item_type = 'Type-Y' 
0

Моего подхода будет создавать множество на штуцера с закодированными значениями other_item_type, как у вас есть

select * from 
(
    select main.*, x.foo as col1, x.bar as col2 
    from main_guys as main 
    inner join x on x.id == main_guys.other_item_id 
    where other_item_type == "Type-X" 
    union 
    select main.*, y.ick as col1, y.bar as col2 
    from main_guys as main 
    inner join y on y.id == main_guys.other_item_id 
    where other_item_type == "Type-Y" 
) as a 

Это зависит от того, сколько различных значений other_item_type у вас есть и сколько из них хотят справиться.

+0

Действительно ли это SQL ...? – pjp

+0

pjp - вы жесткие, сообщение было спасено случайно. Попробуйте ввести + ввести! –

+0

Хорошо :) Зачем вам нужен внешний выбор? – pjp

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