2016-04-07 15 views
1

Ich habe eine übergeordnete Tabelle Run genannt, die Shifts als Kind Fremdschlüssel und diese Verschiebungen haben Beschreibungen in ihrem Tisch hat. Ich muss die Beschreibung einer Kindschicht in einer Abfrage auswählen und auf die Beschreibung dieser Schicht zugreifen, um mit einer anderen Schicht zu vergleichen.Kann dies in MYSQL erfolgen

hier sind die Tabellenbeschreibungen: Run

+----------------------+--------------+------+-----+-------------------+-----------------------------+ 
| 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    |        | 
+--------------+-------------+------+-----+-------------------+-----------------------------+ 

Dies ist die Abfrage, die ich bisher ausprobiert habe und es mich nicht tun lassen (i.Shift iss) Wie kann das gemacht werden?

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; 

gibt diesen Fehler:

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 | 
+-------+---------------+-----------------+-----------+ 

In der obigen Tabelle I die Läufe der Auswahl bin, wo die RunItem Work and Run Work nicht übereinstimmen, diese sagt mir, dass einige der RunItems an den falschen Lauf unter diesem Run zeigen. Die Tabelle unten zeigt die Tabelle, in der Runs einen Footage-Wert von Null haben, was bedeutet, dass runItems nicht auf sie zeigen. Also, was ich brauche, ist, wenn die RunItem Work and Run Work nicht greifen entsprechen der LegacyRun (RunId) und das Vermächtnis RunShift, zeigen alle RunItems wo die zentren in den Run nicht übereinstimmen , die die gleiche LegacyRun (Id hat) und die gleiche Shift.Description und die LegacyRun.

Update_2: läßt die ersten

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

Nachricht von der oberen Tabelle nehmen, dass die legacyRun (Id) ist 21280 es happends nur so, dass die oberen Reihen der unteren Tabelle auch die LegacyRun von 21280 haben

wenn wir ItemId wählen, Work aus RunItem wo Run = 39550 (aus der oberen Tabelle laufen, wo die runItem Workcenter tut Mathe der Lauf); erhalten wir:

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

wir wissen wir, dass runItem mit dem Work von Spreizer Erste Reihe der unteren Tabelle verweisen, die nicht runItems es hat zeigt.

so diese eine Zeile beheben wir tun:

update RunItem set Run = 39552 where ItemId = 110344; 

Ich gehe durch konnte und dies manuell tun, aber ich etwas will, dass alle Zeilen

+2

Die 'UPDATE' Klausel nur die Tabellen aufgeführt sind, gehen Spalten in der' Set' Klausel. – Barmar

+0

Sie verwenden Fremdschlüssel in der 'ON' Klausel einer' JOIN', Sie schreiben Sie sie nicht in der 'UPDATE' Klausel. – Barmar

+0

Was meinst [email protected] –

Antwort

0

ich die Abfrage bekam aktualisieren kann ich brauchte dank @ 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; 

Dies ist eine viel einfacher und elegante Abfrage, sobald ich die JOINON hinzugefügt.

Verwandte Themen