2014-02-08 4 views
5

Таким образом, я получил эту ошибку: # 1066 - Не уникальный стол/псевдоним: «Покупка»Inner Присоединение к той же таблицы несколько раз

Я пытаюсь сделать следующее:

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"; 

Мне нужно было сделать предположение, при котором оплата и покупка предназначены для псевдонимов. Они могут быть неверными в статьях from и where.

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

Вы присоединились к таблице платежей в два раза, если вам нужно присоединиться к нему в два раза нужно ALIAS его, другой псевдоним каждый раз, когда вы присоединиться к этой таблице.

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" 

Вам нужно разобраться, какие варианты покупки и оплаты таблиц выбранные столбцы происходят из, а также то, что должно быть в ИНЕКЕ на самом деле.

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";

Смежные вопросы