我有一个表(让我们称之为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
表中的列bar
和X
获取值。对于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, blah
和other_item_type
也可以为空 - 并且该行中的其余列需要在select中返回 - 但在空的情况下,没有其他任何附加的其他表中的列应包含任何值。
就伪代码而言......
other_item_id
感谢您提供任何帮助或建议。
答案 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的不同值以及想要处理的数量。