2016-04-07 36 views
1

我有一個名爲Run的父表,它具有作爲子外鍵的移位,並且這些移位在其表中有描述。我需要選擇查詢中的子班次描述,並訪問該班次的說明以與另一班次進行比較。這可以在MYSQL中完成

這裏的表說明: 運行

+----------------------+--------------+------+-----+-------------------+-----------------------------+ 
| Field    | Type   | Null | Key | Default   | Extra      | 
+----------------------+--------------+------+-----+-------------------+-----------------------------+ 
| RunId    | int(11)  | NO | PRI | NULL    | auto_increment    | 
| RunType    | varchar(1) | YES |  | NULL    |        | 
| Plant    | varchar(2) | NO | MUL | NULL    |        | 
| Warehouse   | varchar(20) | YES |  | NULL    |        | 
| LegacyId    | int(11)  | YES |  | NULL    |        | 
| RunDate    | date   | NO |  | NULL    |        | 
| Shift    | varchar(20) | NO |  | NULL    |        | 
| NumEmployees   | int(11)  | YES |  | NULL    |        | 
| DryersRan   | tinyint(1) | YES |  | NULL    |        | 
| HogfuelDelivered  | int(11)  | YES |  | NULL    |        | 
| ScheduledStart  | datetime  | YES |  | NULL    |        | 
| ScheduledEnd   | datetime  | YES |  | NULL    |        | 
| ScheduledHours  | decimal(4,2) | YES |  | NULL    |        | 
| Downtime    | int(11)  | YES |  | NULL    |        | 
| ProductLength  | varchar(10) | YES |  | NULL    |        | 
| ProductWidth   | varchar(10) | YES |  | NULL    |        | 
| ProductThickness  | varchar(10) | YES |  | NULL    |        | 
| Species    | varchar(10) | YES | MUL | NULL    |        | 
| NumBlocks   | int(11)  | YES |  | NULL    |        | 
| TestRun    | tinyint(1) | YES |  | NULL    |        | 
| AveDiameter   | decimal(5,2) | YES |  | NULL    |        | 
| BlockScale   | int(11)  | YES |  | NULL    |        | 
| LogScale    | int(11)  | YES |  | NULL    |        | 
| NumSpinouts   | int(11)  | YES |  | NULL    |        | 
| Pieces    | int(11)  | YES |  | NULL    |        | 
| Footage    | int(11)  | YES |  | NULL    |        | 
| Surface    | int(11)  | YES |  | NULL    |        | 
| Coreline    | int(11)  | YES |  | NULL    |        | 
| Dryer1    | int(11)  | YES |  | NULL    |        | 
| Dryer2    | int(11)  | YES |  | NULL    |        | 
| Dryer3    | int(11)  | YES |  | NULL    |        | 
| Sander    | int(11)  | YES |  | NULL    |        | 
| Redry    | int(11)  | YES |  | NULL    |        | 
| GradeStamped   | tinyint(1) | YES |  | NULL    |        | 
| Status    | varchar(10) | YES |  | NULL    |        | 
| Notes    | text   | YES |  | NULL    |        | 
| InventoryTransaction | int(11)  | YES |  | NULL    |        | 
| LastEdited   | timestamp | NO |  | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP | 
| LastEditedBy   | varchar(20) | YES |  | NULL    |        | 
| LegacyRun   | int(11)  | YES |  | NULL    |        | 
| WorkCenter   | varchar(20) | YES | MUL | NULL    |        | 
+----------------------+--------------+------+-----+-------------------+-----------------------------+ 

RunItem:

+--------------+-------------+------+-----+-------------------+-----------------------------+ 
| Field  | Type  | Null | Key | Default   | Extra      | 
+--------------+-------------+------+-----+-------------------+-----------------------------+ 
| ItemId  | int(11)  | NO | PRI | NULL    | auto_increment    | 
| ItemType  | varchar(2) | NO |  | NULL    |        | 
| Run   | int(11)  | YES | MUL | NULL    |        | 
| LegacyRun | int(11)  | YES |  | NULL    |        | 
| WorkCenter | varchar(20) | YES |  | NULL    |        | 
| Product  | int(11)  | YES | MUL | NULL    |        | 
| DayProduced | date  | YES |  | NULL    |        | 
| Source  | varchar(20) | YES |  | NULL    |        | 
| SourceShift | varchar(20) | YES |  | NULL    |        | 
| PieceCount | int(11)  | YES |  | NULL    |        | 
| Surface  | int(11)  | YES |  | NULL    |        | 
| Coreline  | int(11)  | YES |  | NULL    |        | 
| Footage  | int(11)  | YES |  | NULL    |        | 
| LastEdited | timestamp | NO |  | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP | 
| LastEditedBy | varchar(20) | YES |  | NULL    |        | 
| Bundle  | int(11)  | YES | MUL | NULL    |        | 
+--------------+-------------+------+-----+-------------------+-----------------------------+ 

這是我到目前爲止已經試過查詢,它不會讓我做(i.Shift ISS ) 如何才能做到這一點?

update RunItem i, Run r, i.Shift iss, r.Shift rs 
set i.ItemId = (SELECT RunId from Run r where r.LegacyRun = i.LegacyRun and 
rs.Description 
= is.Description 
and r.WorkCenter != i.WorkCenter; 

給出了這樣的錯誤:

ERROR 1146 (42S02): Table 'i.Shift' doesn't exist 

UPDATE:

select r.RunId, i.Run, r.WorkCenter as runWork, i.WorkCenter as itemWork, 
r.Footage, i.LegacyRun as itemLegacy from Run r, RunItem i where r.RunId = i.Run 
and r.WorkCenter != i.WorkCenter and RunDate >= '2016-02-01' and RunDate <= '2016-02-29'; 

| 39550 | 39550 | P3-LAYUP  | P3-SPREADER | 260818 |  21280 | 
| 39553 | 39553 | P3-LAYUP  | P3-SPREADER | 267421 |  21281 | 
| 39566 | 39566 | P3-8FTSAWLINE | P3-SPREADER | 351547 |  21286 | 
| 39569 | 39569 | P3-8FTSAWLINE | P3-SPREADER | 527049 |  21287 | 
| 39605 | 39605 | P3-8FTSAWLINE | P3-SPREADER | 460826 |  21316 | 
| 39605 | 39605 | P3-8FTSAWLINE | P3-SPREADER | 460826 |  21316 | 
| 39605 | 39605 | P3-8FTSAWLINE | P3-SPREADER | 460826 |  21316 | 
| 39608 | 39608 | P3-8FTSAWLINE | P3-SPREADER | 458272 |  21317 | 
| 39625 | 39625 | P3-8FTSAWLINE | P3-SPREADER | 503324 |  21327 | 
| 39628 | 39628 | P3-LAYUP  | P3-SPREADER | 339615 |  21328 | 
| 39628 | 39628 | P3-LAYUP  | P3-SPREADER | 339615 |  21328 | 
+-------+-------+---------------+-------------+---------+------------+ 

select RunId, WorkCenter, Shift, 
LegacyRun from Run where Footage is null 
and RunDate >='2016-02-01' and RunDate <='2016-02-29'; 


| 39552 | P3-SPREADER | P3-DAY-SPREAD |  21280 | 
| 39555 | P3-SPREADER | P3-SWING-SPREAD |  21281 | 
| 39568 | P3-SPREADER | P3-DAY-SPREAD |  21286 | 
| 39571 | P3-SPREADER | P3-SWING-SPREAD |  21287 | 
| 39607 | P3-SPREADER | P3-DAY-SPREAD |  21316 | 
| 39609 | P3-SPREADER | P3-SWING-SPREAD |  21317 | 
| 39626 | P3-SPREADER | P3-DAY-SPREAD |  21327 | 
| 39629 | P3-SPREADER | P3-SWING-SPREAD |  21328 | 
| 39647 | P3-8FTSAWLINE | P3-DAY-SL  |  21339 | 
| 39649 | P3-8FTSAWLINE | P3-SWING-SL  |  21340 | 
+-------+---------------+-----------------+-----------+ 

在上表中,我選擇在RunItem工作中心和運行工作中心不匹配的運行,這告訴我,根據該運行 一些RunItems指向錯誤的運行。下面的表格是運行時鏡頭值爲零的表格,這意味着它們沒有指向它們的runItem。 所以我需要的是,當RunItem WorkCenter和Run WorkCenter不匹配時,抓住LegacyRun(RunId)和Legacy RunShift,指出WorkCenters不匹配的所有RunItem與運行 具有相同的LegacyRun(Id )和相同的Shift.Description和LegacyRun。

UPDATE_2: 讓我們首先從頂級表

| 39550 | 39550 | P3-LAYUP  | P3-SPREADER | 260818 |  21280 | 

公告稱,legacyRun(ID)是21280 它只是happends的底表的頂部行也有21280的LegacyRun

如果我們從RunItem中選擇ItemId,WorkCenter,其中Run = 39550(從runItem工作中心不運算數學運行的頂部表中運行); 我們得到:

+--------+-------------+ 
| ItemId | WorkCenter | 
+--------+-------------+ 
| 110336 | P3-LAYUP | 
| 110344 | P3-SPREADER | 
+--------+-------------+ 

我們知道我們有指向與吊具的工作中心,以不具有指向它runItems底部的表的第一行runItem。

所以要解決這個問題一個行,我們做的:

update RunItem set Run = 39552 where ItemId = 110344; 

我可以繼續通過手動做到這一點,但我想要的東西,可以更新所有行

+2

'UPDATE'子句只是列出表,列放在'SET'子句中。 – Barmar

+0

您在'JOIN'的'ON'子句中使用外鍵時,您不會在'UPDATE'子句中列出它們。 – Barmar

+0

你是什麼意思?@Barmar –

回答

0

我得到的查詢,我需要感謝@ Barmar:

UPDATE RunItem i JOIN Run r 
ON r.LegacyRun = i.LegacyRun 
AND r.WorkCenter = i.WorkCenter 
JOIN Run rr 
ON rr.RunId = i.Run 
SET i.Run = r.RunId 
where i.WorkCenter != rr.WorkCenter; 

這是一個更簡單和優雅的查詢,一旦我添加了JOINON