2014-02-08 53 views
5

所以,我收到此錯誤:#1066 - 不唯一的表/別名:「購買」內側連接在同一個表多次

我努力做到以下幾點:

SELECT Blank.BlankTypeCode 
      ,Blank.BlankCode 
      ,Payment.Amount 
      ,Payment.Type 
      ,Purchase.PurchaseDate 
      ,Payment.DatePaid 
FROM Blank 
INNER JOIN Ticket 
ON Blank.BlankCode = Ticket.Blank_BlankCode 
INNER JOIN MCO_Blank 
ON Blank.BlankCode = MCO_Blank.Blank_BlankCode 
INNER JOIN Purchase 
ON Ticket.PurchaseID = Purchase.PurchaseID 
INNER JOIN Purchase 
ON MCO_Blank.PurchaseID = Purchase.PurchaseID 
INNER JOIN Payment 
ON Ticket.PurchaseID = Payment.PurchaseID 
INNER JOIN Payment 
ON MCO_Blank.PurchaseID = Payment.PurchaseID 
WHERE Payment.Status = "Paid"; 

空白表組成:

BlankCode, 
IssueDate, 
Status, 
UserID, 
BlankTypeCode 

付款表包括:

Type, 
Amount, 
Status, 
DueDate, 
PurchaseID, 
CurrencyRateDate 

採購表包括:

PurchaseID, 
CustomerID, 
PurchaseDate, 
TotalFare, 
TaxAmount, 
CurrencyType, 
Purchasecol 

票務表包括:

Price, 
PurchaseID, 
Blank_BlankCode, 
Blank_BlankTypeCode, 
TicketType, 
Airline_Name 

MCO_Blank表包括:

Service, 
Cost, 
Description, 
Purchase_PurchaseID, 
Blank_BlankCode, 
Blank_BlankTypeCode 

我不確定我怎樣才能使這項工作。

回答

6

您需要使用表別名。您在from子句中多次提到同一個表。該查詢是這樣的:

SELECT b.BlankTypeCode, b.BlankCode, pa1.Amount, pa1.Type, p1.PurchaseDate, pa2.DatePaid 
FROM Blank b 
INNER JOIN Ticket t 
ON b.BlankCode = t.Blank_BlankCode 
INNER JOIN MCO_Blank mb 
ON b.BlankCode = mb.Blank_BlankCode 
INNER JOIN Purchase p1 
ON t.PurchaseID = p1.PurchaseID 
INNER JOIN Purchase p2 
ON mb.PurchaseID = p2.PurchaseID 
INNER JOIN Payment pa1 
ON t.PurchaseID = pa1.PurchaseID 
INNER JOIN Payment pa2 
ON mc.PurchaseID = pa2.PurchaseID 
WHERE pa1.Status = "Paid"; 

我不得不猜測哪些付款和購買的目的是別名。這些在fromwhere子句中可能不正確。

+0

同時使用連接謂詞的共同的東西是我我也在列中使用ON,我不會在結果集中查看,所以我不確定別名是什麼。 – JP24

+0

@ JP24。 。 。我認爲'on'子句中的別名是正確的。它們更容易理解,因爲它們應該引用「最近」的表格引用。 –

+0

我嘗試過這樣做,但我收到了一個錯誤 - #1054 - '字段列表'中的未知列'p2.DatePaid' – JP24

0
INNER JOIN Purchase 
ON MCO_Blank.PurchaseID = Purchase.PurchaseID 
INNER JOIN Payment       --<-- 
ON Ticket.PurchaseID = Payment.PurchaseID 
INNER JOIN Payment       --<-- 
ON MCO_Blank.PurchaseID = Payment.PurchaseID 
WHERE Payment.Status = "Paid"; 

您已加入Payments表兩次,如果您確實需要加入兩次,則需要別名,每次加入此表時都使用不同的別名。

1

每次使用該表時,都需要使用不同的別名。

SELECT B.BlankTypeCode, B.BlankCode, A1.Amount, A1.Type, P1.PurchaseDate, P1.DatePaid 
    FROM Blank AS B 
    JOIN Ticket AS T ON B.BlankCode = T.Blank_BlankCode 
    JOIN MCO_Blank AS M ON B.BlankCode = M.Blank_BlankCode 
    JOIN Purchase AS P1 ON T.PurchaseID = P1.PurchaseID 
    JOIN Purchase AS P2 ON M.PurchaseID = P2.PurchaseID 
    JOIN Payment AS A1 ON T.PurchaseID = A1.PurchaseID 
    JOIN Payment AS A2 ON M.PurchaseID = A2.PurchaseID 
WHERE A1.Status = "Paid" 
    AND A2.Status = "Paid" 

你需要理清購付匯表中選中列來自於哪個版本的,也應該是什麼在WHERE子句中真的。

2

你無法加入表不止一次使用相同的名稱,所以要麼用別名加入像inner join purchase p1 on...或類似inner join purchase ON first predicate AND second predicate

1

SELECT bl.BlankTypeCode ,bl.BlankCode ,pymt.Amount ,pymt.Type ,purc.PurchaseDate ,pymt.DatePaid FROM Blank bl INNER JOIN Ticket tk ON bl.BlankCode = tk.Blank_BlankCode INNER JOIN MCO_Blank mco_bl ON bl.BlankCode = mco_bl.Blank_BlankCode INNER JOIN Purchase purc ON tk.PurchaseID = purc.PurchaseID AND mco_bl.PurchaseID = purc.PurchaseID INNER JOIN Payment pymt ON tk.PurchaseID = pymt.PurchaseID AND mco_bl.PurchaseID = pymt.PurchaseID WHERE pymt.Status = "Paid";