我有以下通用表结构(在我的人为示例中,请原谅以美国为中心的汽车制造商):
CREATE TABLE Car (
[Id] int PRIMARY KEY
)
CREATE TABLE Ford (
[FordId] int PRIMARY KEY, --also a foreign key on Car
[Model] nvarchar(max)
)
CREATE TABLE Chevy (
[ChevyId] int PRIMARY KEY, --also a foreign key on Car
[Model] nvarchar(max)
)
我想在这些表上创建一个视图,以便我可以检索所有福特和雪佛兰,并在视图中生成一个告诉我品牌的列。我的第一个刺是这样的:
SELECT
c.CarId,
case when f.FordId is not null then 'Ford' else 'Chevy' end
FROM Car as c
LEFT JOIN Ford as f on c.Id = f.FordId
LEFT JOIN Chevy as ch on c.Id = ch.ChevyId
WHERE (f.FordId is not null or ch.ChevyId is not null)
但这在我嘴里留下了不好的味道,我担心性能。以不同的 CTE 值检索所有福特和雪佛兰,然后对它们执行联合,我会更好吗?我完全走错了吗?我还需要包含 Model 列(以及两个子表共有的其他一些列),这显然会使我的视图变成一系列巨大的案例陈述。处理这种情况的“正确”方法是什么?
编辑:我想我应该补充一点,这个模式已经存在,所以改变基础表是不可能的。