0

我需要解决下一个问题:我们有两个表,它们之间没有任何关系。首先,它们包含一些关于少数对象的信息。类似的东西

create table properties
(
    obj1_prop1 varchar(10),
    obj1_prop2 varchar(10),
    obj1_prop3 varchar(10),
    obj2_prop1 varchar(10),
    obj2_prop2 varchar(10),
    obj2_prop3 varchar(10),
    obj3_prop1 varchar(10),
    obj3_prop2 varchar(10),
    obj3_prop3 varchar(10),
    obj4_prop1 varchar(10),
    obj4_prop2 varchar(10),
    obj4_prop3 varchar(10),
    id int not null,
    primary key (id)
)

每个对象都由较小的对象组成(每个对象都有一些额外的属性)。我们没有关于较小物体数量的信息。此信息存储在第二个表中,类似于

create table parts
(
    obj_id int not null,
    prop1 varchar(10),
    prop2 varchar(10),
    prop3 varchar(10),
    extra_prop varchar(10)
)

我应该使用什么查询来从该表中以第一个表的格式获取数据具有此extra_prop列。结果应该看起来像我们有一个包含下一个字段的表:

create table properties
(
    obj1_prop1 varchar(10),
    obj1_prop2 varchar(10),
    obj1_prop3 varchar(10),
    obj1_extra_prop varchar(10),
    obj2_prop1 varchar(10),
    obj2_prop2 varchar(10),
    obj2_prop3 varchar(10),
    obj2_extra_prop varchar(10),
    obj3_prop1 varchar(10),
    obj3_prop2 varchar(10),
    obj3_prop3 varchar(10),
    obj3_extra_prop varchar(10),
    obj4_prop1 varchar(10),
    obj4_prop2 varchar(10),
    obj4_prop3 varchar(10),
    obj4_extra_prop varchar(10),
    id int not null,
    primary key (id)
)
4

1 回答 1

0

您需要将 obj_id 引用列添加到属性表中。因此,理想情况下,您最终将拥有 4 个这样的字段。然后就可以加入了。

create table properties
(
    obj1_id int,
    obj1_prop1 varchar(10),
obj1_prop2 varchar(10),
obj1_prop3 varchar(10),
obj2_id int,
obj2_prop1 varchar(10),
obj2_prop2 varchar(10),
obj2_prop3 varchar(10),
obj3_id int,
obj3_prop1 varchar(10),
obj3_prop2 varchar(10),
obj3_prop3 varchar(10),
obj4_id int,
obj4_prop1 varchar(10),
obj4_prop2 varchar(10),
obj4_prop3 varchar(10),
id int not null,
primary key (id)
)

然后你可以加入如下

SELECT *[set your columns here] FROM properties AS p 
LEFT OUTER JOIN parts AS p1 ON p1.obj_id = p.obj1_id  
LEFT OUTER JOIN parts AS p2 ON p2.obj_id = p.obj2_id  
LEFT OUTER JOIN parts AS p3 ON p3.obj_id = p.obj3_id  
LEFT OUTER JOIN parts AS p4 ON p4.obj_id = p.obj4_id  
于 2013-05-26T11:58:02.740 回答