簡體   English   中英

在mysql中,如何在子查詢中添加另一個表聯接?

[英]In mysql how do I add another table join within a subquery?

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

檢查您的查詢,第三個內部聯接沒有條件。 而且,如果您要INNER JOIN則無需在您的FROM子句中包含Status

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;

這些查詢在語義上是相同的。 但是請記住,您將表放在了join或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 |
+----------+-------------+----------+--------------+---------+-----------+----------+-------+
  • 請注意,在您的問題中有兩列名為ErrorHigh。
  • 數學“錯誤” x + x = 2 * x(其中x = u4.value * s.error_value)
  • 可能是最糟糕的數學錯誤:) x-x = 0(其中x = u5.value * s.error_value)

所以我想這個查詢不是您真正需要的,但足以引導您朝正確的方向前進。 祝好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM