OrientDB SQL 模拟多对多连接的查询
OrientDB SQL query to emulate a many to many join
给定以下使用 OrientDB 文档创建的模式 API:
OClass team = getoDocDatabase().getMetadata().getSchema().createClass(TEAM);
team.createProperty(NAME, OType.STRING);
OClass driver = getoDocDatabase().getMetadata().getSchema().createClass(DRIVER);
driver.createProperty(NAME, OType.STRING);
OClass car = getoDocDatabase().getMetadata().getSchema().createClass(CAR);
car.createProperty(NAME, OType.STRING);
// Relationships
team.createProperty(CARS_HERITAGE, OType.LINKSET, car);
car.createProperty(BUILT_BY, OType.LINK, team);
car.createProperty(DRIVEN_BY, OType.LINKSET, driver);
driver.createProperty(DRIVER_OF, OType.LINKSET, car);
获取费尔南多·阿隆索效力过的所有球队的sql查询是什么?
在关系中 SQL 就像
SELECT team.name FROM {the join} where driver.name = 'Fernando Alonso'
我试过这个数据库
create class Team
CREATE PROPERTY Team.name String
create class DRIVER
CREATE PROPERTY DRIVER.name String
create class Car
CREATE PROPERTY Car.name String
CREATE PROPERTY Team.CARS_HERITAGE LINKSET Car
CREATE PROPERTY Car.BUILT_BY LINK Team
CREATE PROPERTY Car.DRIVEN_BY LINKSET DRIVER
CREATE PROPERTY DRIVER.DRIVER_OF LINKSET Car
插入
INSERT INTO TEAM(name) values ("Ferrari"),("Renault") // Ferrari 12:0 Renault 12:1
insert into Driver(name) values ("Fernando Alonso"),("Giancarlo Fisichella") // Alonso 13:0 Fisichella 13:1
insert into car(name,BUILT_BY,DRIVEN_BY) values ("car ferrari",#12:0,[#13:0,#13:1])
insert into car(name,BUILT_BY,DRIVEN_BY) values ("car renault",#12:1,[#13:0])
查询
select BUILT_BY.name as TeamName from car where DRIVEN_BY.name contains "Fernando Alonso"
希望对您有所帮助。
更新 1
select distinct(BUILT_BY.name) as team from car where DRIVEN_BY.name contains "Fernando Alonso"
来自 JAVA API
更新 2
来自 JAVA API
@Alessandro 的回答是正确的,但是我发现 sql 的解释方式有些奇怪。让我解释一下。
我已经简化了目标,让我们尝试查找查询以获取至少拥有一辆汽车的车队。
第一个查询有效,是亚历山德罗建议的。它 return 是一个文件列表,其中包含一个 属性,即团队的名称。
select distinct(team.name) as name from Car
第二个查询也有效,return正在获取团队列表(作为文档)。
select expand(distinct(team)) from Car
第三个查询有效并且 return 的结果与前一个完全相同,因此它忽略了 select.
的“.name”部分
select expand(distinct(team)).name from Car
最后一次查询失败。好吧,它没有失败,但它没有 return 我所期望的,它 return 是一个指向团队的链接列表。
select distinct(team).name from Car
测试 运行 查询:Tests。
给定以下使用 OrientDB 文档创建的模式 API:
OClass team = getoDocDatabase().getMetadata().getSchema().createClass(TEAM);
team.createProperty(NAME, OType.STRING);
OClass driver = getoDocDatabase().getMetadata().getSchema().createClass(DRIVER);
driver.createProperty(NAME, OType.STRING);
OClass car = getoDocDatabase().getMetadata().getSchema().createClass(CAR);
car.createProperty(NAME, OType.STRING);
// Relationships
team.createProperty(CARS_HERITAGE, OType.LINKSET, car);
car.createProperty(BUILT_BY, OType.LINK, team);
car.createProperty(DRIVEN_BY, OType.LINKSET, driver);
driver.createProperty(DRIVER_OF, OType.LINKSET, car);
获取费尔南多·阿隆索效力过的所有球队的sql查询是什么?
在关系中 SQL 就像
SELECT team.name FROM {the join} where driver.name = 'Fernando Alonso'
我试过这个数据库
create class Team
CREATE PROPERTY Team.name String
create class DRIVER
CREATE PROPERTY DRIVER.name String
create class Car
CREATE PROPERTY Car.name String
CREATE PROPERTY Team.CARS_HERITAGE LINKSET Car
CREATE PROPERTY Car.BUILT_BY LINK Team
CREATE PROPERTY Car.DRIVEN_BY LINKSET DRIVER
CREATE PROPERTY DRIVER.DRIVER_OF LINKSET Car
插入
INSERT INTO TEAM(name) values ("Ferrari"),("Renault") // Ferrari 12:0 Renault 12:1
insert into Driver(name) values ("Fernando Alonso"),("Giancarlo Fisichella") // Alonso 13:0 Fisichella 13:1
insert into car(name,BUILT_BY,DRIVEN_BY) values ("car ferrari",#12:0,[#13:0,#13:1])
insert into car(name,BUILT_BY,DRIVEN_BY) values ("car renault",#12:1,[#13:0])
查询
select BUILT_BY.name as TeamName from car where DRIVEN_BY.name contains "Fernando Alonso"
希望对您有所帮助。
更新 1
select distinct(BUILT_BY.name) as team from car where DRIVEN_BY.name contains "Fernando Alonso"
来自 JAVA API
更新 2
来自 JAVA API
@Alessandro 的回答是正确的,但是我发现 sql 的解释方式有些奇怪。让我解释一下。
我已经简化了目标,让我们尝试查找查询以获取至少拥有一辆汽车的车队。
第一个查询有效,是亚历山德罗建议的。它 return 是一个文件列表,其中包含一个 属性,即团队的名称。
select distinct(team.name) as name from Car
第二个查询也有效,return正在获取团队列表(作为文档)。
select expand(distinct(team)) from Car
第三个查询有效并且 return 的结果与前一个完全相同,因此它忽略了 select.
的“.name”部分select expand(distinct(team)).name from Car
最后一次查询失败。好吧,它没有失败,但它没有 return 我所期望的,它 return 是一个指向团队的链接列表。
select distinct(team).name from Car
测试 运行 查询:Tests。