下面是我的查询,以获取一些对象的大量属性。无论如何都要优化和缩短它?
SELECT object_id, value, name FROM attr_text WHERE object_id IN ('43', '42', '41', '40', '39')
UNION
SELECT object_id, value, name FROM attr_varchar WHERE object_id IN ('43', '42', '41', '40', '39')
UNION
SELECT object_id, value, name FROM attr_int WHERE object_id IN ('43', '42', '41', '40', '39')
UNION
SELECT object_id, value, name FROM attr_decimal WHERE object_id IN ('43', '42', '41', '40', '39')
UNION
SELECT object_id, value, name FROM attr_datetime WHERE object_id IN ('43', '42', '41', '40', '39')
结果:
43 red color1
43 blue color2
43 small size
42 black color1
42 big size
答案 0 :(得分:2)
您可以做出的最明显的改进是使用合理的架构。
假设这不是一个选项,我建议将UNION
更改为UNION ALL
,因为您可能没有多个具有相同名称和值的属性。 UNION [DISTINCT]
只是执行不必要的比较。在任何情况下,您都不会处理当前查询中具有相同名称和不同值的属性。
答案 1 :(得分:1)
我也建议你可以做的最好的改进是使用理智的架构。详细说明,如果您可以为对象定义离散的列列表,它将极大地简化您的SQL并提高性能,如下所示:
create table [Object] (
[object_id] [int] IDENTITY(1,1) NOT NULL,
[color1] [varchar](255) null,
[color2] [varchar](255) null,
[size] [varchar](255) null
... any other properties....
)
alter table Object
add constraint PK_object_id
primary key clustered (
object_id
)
然后,您可以使用简单的选择选择所有对象:
select * from object where object_id in ( '43', '42', '41', '40', '39' )