Table: Unit
ID NAME VALUE
1 Kilo 1000
2 Mega 1000000
3 Giga 1000000000
Table: Storage
ID Title Drive_value DriveUnitID Cache_value CacheUnitID Status_ID error error_unit area
1 Seagate 100 3 400 1 2 1 1 1
2 Scansoft 250 3 80 2 1 1 2 2
Table: manufac
ID area
1 US
2 CHINA
Table: Status
ID Description
1 Blah.. Blah
2 Durka Durka
期望的目标是有一个连接三个表的子选择 像这样的东西(如下),但这种语法不起作用
select
s.title,
t.description,
x.area,
u1.value * s.cache_value as Cache,
u2.value * s.drive_value as Drive,
u3.value * s.error_value as Error
((u4.value * s.error_value)+(u4.value * s.error_value)) as ErrorHigh
((u5.value * s.error_value)-(u5.value * s.error_value)) as ErrorHigh
from storage s
join status t on t.id = s.status_id
join manufac x on x.id = s.manufac_id
join unit u1 on s.cache_unit_id = u1.id
join unit u2 on s.drive_unit_id = u2.id
join unit u3 on s.error_unit_id = u3.id
join unit u4 on s.error_unit_id = u4.id
join unit u5 on s.error_unit_id = u5.id
答案 0 :(得分:3)
检查您的查询,第三个内部联接没有条件。如果您要转发Status
,则无需在FROM
条款中加入INNER JOIN
!
SELECT
s.Title,
t.Description,
u1.VALUE * s.Drive_value AS Drive,
u2.VALUE * s.Cache_value AS Cache
FROM Storage s
INNER JOIN Unit u1 ON u1.ID = s.DriveUnitID
INNER JOIN Unit u2 ON u2.ID = s.CacheUnitID
INNER JOIN Status t ON t.ID = s.Status_ID;
答案 1 :(得分:1)
此查询在语义上是相同的。但请记住,要么将表放在连接中,要么放在from子句中:
使用显式连接:
select s.title, t.description,
u1.value * s.cache_value as Cache,
u2.value * s.drive_value as Drive
from storage s
join status t on t.id = s.status_id
join unit u1 on s.cache_unit_id = u1.id
join unit u2 on s.drive_unit_id = u2.id
使用隐式连接:
select s.title, t.description,
u1.value * s.cache_value as Cache,
u2.value * s.drive_value as Drive
from storage s, status t, unit u1, unit u2
where t.id = s.status_id and s.cache_unit_id = u1.id and s.drive_unit_id = u2.id
最终用户的最终结果是相同的,DBMS也以相同的方式处理两个查询,因此使用其中一个没有性能增加。
修改强>
在要求更改后,这是我认为您正在寻找的查询:
select s.title, t.description,
u1.value * s.cache_value as Cache,
u2.value * s.drive_value as Drive,
u3.value * s.error_value as Error,
u3.value * s.error_value * 2 as ErrorHigh,
u3.value * s.error_value - u3.value * s.error_value as ErrorLow,
m.area
from storage s
join status t on t.id = s.status_id
join manufac m on m.id = s.area
join unit u1 on s.cache_unit_id = u1.id
join unit u2 on s.drive_unit_id = u2.id
join unit u3 on s.error_unit_id = u3.id
结果:
+----------+-------------+----------+--------------+---------+-----------+----------+-------+
| TITLE | DESCRIPTION | CACHE | DRIVE | ERROR | ERRORHIGH | ERRORLOW | AREA |
+----------+-------------+----------+--------------+---------+-----------+----------+-------+
| Seagate | Durka Durka | 400000 | 100000000000 | 1000 | 2000 | 0 | US |
| Scansoft | Blah.. Blah | 80000000 | 250000000000 | 1000000 | 2000000 | 0 | CHINA |
+----------+-------------+----------+--------------+---------+-----------+----------+-------+
所以我猜这个查询不是你真正需要的,但应该足以引导你朝着正确的方向前进。祝你好运!