跨表的T-SQL条件选择

时间:2009-08-12 08:06:02

标签: tsql sqlite

我有一个表(让我们称之为main_guys)看起来像:

id, other_item_id, other_item_type, another_column, group_id

other_item_type告诉我哪个附加表包含other_item_id标识的其他信息。

查询中所需的其他列取决于other_item_type标识的表。因此,对于other_item_type == 'Type-X',我需要从foo表中的列barX获取值。对于other_item_type == Type-Y,我需要从ick and blah的{​​{1}}列中获取值。

在一个完美的世界里,我可以得到类似的东西:

Y table - 在每个类型需要的地方填写值,其他列为空或者不需要的话。

另一个问题是id, other_item_id, other_item_type, another_column, group_id, foo, bar, ick, blahother_item_type也可以为空 - 并且该行中的其余列需要在select中返回 - 但在空的情况下,没有其他任何附加的其他表中的列应包含任何值。

就伪代码而言......

other_item_id

感谢您提供任何帮助或建议。

4 个答案:

答案 0 :(得分: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

答案 1 :(得分: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'

如果我理解正确,那就意味着您可以在主表的一列中引用两个(或更多)表。我建议您更改主表的设计,使 一列 一个含义

答案 2 :(得分: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'

答案 3 :(得分: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的不同值以及想要处理的数量。