2017-04-26 35 views
0

我有這個怪物查詢從我的逆向工程的Java應用程序。如何自我加入和案件時

`

SELECT 
    T.transferNumber, 
    T.TransferNumber, 
    T.BarrelsRequested - T.TotalBarrels br, 
    TrTy.TransferTypeName, 
    TrTa.SourceDest, 
    Ta.TankName, 
    SBP.SBPName, 
    T.Notes 
FROM 
    RC.Transfers T, 
    RC.TransferTypes TrTy, 
    RC.TransferTank TrTa, 
    RC.Tanks Ta, 
    RC.ShipBargePipe SBP 
WHERE 
    T.TransferTypeNumber = TrTy.TransferTypeNumber 
    AND T.TransferNumber = TrTa.TransferNumber 
    AND TrTa.TankNumber = Ta.TankNumber 
    AND T.SBPNumber = SBP.SBPNumber 
    AND T.StartStamp IS NOT NULL 
    AND T.EndStamp IS NULL 
    AND T.Void IS NULL 
    AND TrTy.TransferTypeName <> 'Truck' 
UNION SELECT 
    T.transferNumber, 
    T.TransferNumber, 
    T.BarrelsRequested - T.TotalBarrels, 
    TrTy.TransferTypeName, 
    TrTa.SourceDest, 
    Ta.TankName, 
    '', 
    T.Notes 
FROM 
    RC.Transfers T, 
    RC.TransferTypes TrTy, 
    RC.TransferTank TrTa, 
    RC.Tanks Ta 
WHERE 
    T.TransferTypeNumber = TrTy.TransferTypeNumber 
    AND T.TransferNumber = TrTa.TransferNumber 
    AND TrTa.TankNumber = Ta.TankNumber 
    AND T.SBPNumber IS NULL 
    AND T.StartStamp IS NOT NULL 
    AND T.EndStamp IS NULL 
    AND T.Void IS NULL 
    AND TrTy.TransferTypeName <> 'Truck' 

`

這將返回的結果集的:

enter image description here

但我真的想:

enter image description here

任何幫助將不勝感激。如圖所示,我希望具有相同傳輸號碼的行在一行上顯示。我想加盟,我可以做到這一點使用自和 情況下,當SourceDest =「s」,因爲「從」 情況下,當SourceDest =「d」 AS「TO」

還要注意,當類型爲船舶或管道,然後from或To列成爲SBPName,取決於它是源還是目標。

謝謝!隨意修改我的問題,因爲你覺得合適。

編輯*

在這裏是表示它們是如何分組的行一起Java源代碼。 `

void updateRunning(Connection conn) 
    throws SQLException 
    { 
    Query q = new Query(conn); 
    this.jLabelRunningUpdate.setText("Reading"); 
    this.jLabelRunningUpdate.setVisible(true); 

    q 
     .setQuery("SELECT T.transferNumber, T.TransferNumber, T.BarrelsRequested - T.TotalBarrels br,  TrTy.TransferTypeName, TrTa.SourceDest, Ta.TankName, SBP.SBPName, T.Notes FROM RC.Transfers T, RC.TransferTypes TrTy, RC.TransferTank TrTa, RC.Tanks Ta,  RC.ShipBargePipe SBP WHERE T.TransferTypeNumber = TrTy.TransferTypeNumber AND T.TransferNumber = TrTa.TransferNumber AND TrTa.TankNumber = Ta.TankNumber AND T.SBPNumber = SBP.SBPNumber AND T.StartStamp is not NULL AND T.EndStamp is NULL AND T.Void is NULL AND TrTy.TransferTypeName <> 'Truck' UNION SELECT T.transferNumber, T.TransferNumber, T.BarrelsRequested - T.TotalBarrels,  TrTy.TransferTypeName, TrTa.SourceDest, Ta.TankName, '', T.Notes FROM RC.Transfers T, RC.TransferTypes TrTy, RC.TransferTank TrTa, RC.Tanks Ta WHERE T.TransferTypeNumber = TrTy.TransferTypeNumber AND T.TransferNumber = TrTa.TransferNumber AND TrTa.TankNumber = Ta.TankNumber AND T.SBPNumber is NULL AND T.StartStamp is not NULL AND T.EndStamp is NULL AND T.Void is NULL AND TrTy.TransferTypeName <> 'Truck'"); 

    ResultSetCA transfers = q.execute(false); 

    this.jLabelRunningUpdate.setText("Updating"); 

    String sourceTankList = ""; 
    String destinationTankList = ""; 
    ResultSetCA runningList = new ResultSetCA(); 
    for (int count = 0; count < transfers.size(); count++) 
    { 
     sourceTankList = ""; 
     destinationTankList = ""; 

     String currentTNumber = transfers.getString(count, "transferNumber"); 
     while ((count < transfers.size()) && (
     currentTNumber.equals(transfers.getString(count, "transferNumber")))) 
     { 
     String sourceDest = transfers.getString(count, "sourceDest"); 
     String tankName = transfers.getString(count, "tankName"); 
     if (sourceDest.equals("s")) { 
      sourceTankList = sourceTankList + tankName + ", "; 
     } else { 
      destinationTankList = destinationTankList + tankName + ", "; 
     } 
     count++; 
     } 
     if (!sourceTankList.equals("")) { 
     sourceTankList = sourceTankList.substring(0, sourceTankList.length() - 2); 
     } 
     if (!destinationTankList.equals("")) { 
     destinationTankList = 
      destinationTankList.substring(0, destinationTankList.length() - 2); 
     } 
     count--;int lastCount = count; 

     String transferTypeName = transfers.getString(lastCount, "transferTypeName"); 
     if (!transferTypeName.equals("Tank")) 
     { 
     String sbpName = transfers.getString(lastCount, "sbpName"); 
     if (sourceTankList.equals("")) { 
      sourceTankList = sbpName; 
     } else { 
      destinationTankList = sbpName; 
     } 
     } 
     Number barrelsRemaining = transfers.getNumber(lastCount, "br"); 
     Object BBLS; 
     Object BBLS; 
     if (barrelsRemaining == null) { 
     BBLS = "????"; 
     } else { 
     BBLS = new Integer(barrelsRemaining.intValue()); 
     } 
     Vector register = new Vector(); 

     Integer transferNumber = transfers.getInteger(lastCount, "transferNumber"); 
     String transferTName = transfers.getString(lastCount, "transferTypeName"); 
     String notes = transfers.getString(lastCount, "notes"); 

     register.add(transferNumber); 
     register.add(transferNumber); 
     register.add(BBLS); 
     register.add(transferTName); 
     register.add(sourceTankList); 
     register.add(destinationTankList); 
     register.add(notes); 

     runningList.add(register); 
    } 
    Object key = null; 
    if (this.jTableTransfersRunning.getSelectedRow() != -1) { 
     key = this.jTableTransfersRunning.getSelectedKey(); 
    } 
    this.jTableTransfersRunning.fill(runningList); 
    if (runningList.size() > 0) { 
     if (key != null) { 
     this.jTableTransfersRunning.setSelectedKey(key); 
     } 
    } 
    this.jLabelRunningUpdate.setVisible(false); 
    } 

`

回答

1

EDITED

試試這個:

SELECT 
    T.transferNumber, 
    T.BarrelsRequested - T.TotalBarrels AS `BBLs left`, 
    TrTy.TransferTypeName AS `Type`, 
    IF(TrTy.TransferTypeName = 'Tank',Ta.TankName,IFNULL(Ta.TankName,SBP.SBPName)) AS `From`, 
    IF(TrTy.TransferTypeName = 'Tank',Ta1.TankName,IFNULL(Ta1.TankName,SBP.SBPName)) AS `To`, 
    T.notes 
FROM transfers T 
JOIN transfertypes TrTy 
    ON T.TransferTypeNumber = TrTy.TransferTypeNumber 
LEFT JOIN transfertank TrTa 
    ON T.TransferNumber = TrTa.TransferNumber 
    AND TrTa.SourceDest = 's' 
LEFT JOIN tanks Ta 
    ON TrTa.TankNumber = Ta.TankNumber 
LEFT JOIN transfertank TrTa1 
    ON T.TransferNumber = TrTa1.TransferNumber 
    AND TrTa1.SourceDest = 'd' 
LEFT JOIN tanks Ta1 
    ON TrTa1.TankNumber = Ta1.TankNumber 
LEFT JOIN shipbargepipe SBP 
    ON T.SBPNumber = SBP.SBPNumber 
WHERE T.StartStamp IS NOT NULL 
    AND T.EndStamp IS NULL 
    AND T.Void IS NULL 
    AND TrTy.TransferTypeName <> 'Truck' 
ORDER BY TRANSFERNUMBER 
+0

返回一行: transferNubmer,桶離開,船舶,TransferTypeName,發件人,收件人,說明 76252,108,坦克,坦克,空,坦克051A '' –

+0

轉移數它返回的(假設它是從你問題的其中一行)。 transferNumber和TransferNumber之間有什麼區別/意義? –

+0

它將一個坦克返回坦克轉移。這是76252. 他們如何做坦克到坦克,或坦克到船/駁船,或駁船/船到坦克,這很奇怪。 –

0

加入這個子查詢,而不是與TransferTank直接加盟:

(SELECT t1.TransferNumber, t1.TankNumber, t1.SBPName AS From, t2.SBPName AS To 
FROM TransferTank AS t1 
JOIN TransferTank AS t2 
    ON t1.TransferNumber = t2.TransferNumber 
    AND t1.TankNumber = t2.TankNumber 
WHERE t1.SourceDest = 's' 
AND t2.SourceDesc = 'd') AS TrTa