2012-06-05 100 views
1

比方說,我有以下型號:查詢在關聯表的外鍵

Customer(customer_id (PK), firstName, lastName, email) 
Item(item_id (PK), name, description) 
Orders(orders_id (PK), customer_id (FK), item_id (FK), promotion_id (FK)), 
Promotion(promotion_id (PK), date, gift_id (FK)) 
Gift(gift_id (PK), name, description) 

現在,讓我們說,我有以下要求:

檢索所有訂單列表(沒有分組)來自所有客戶以及來自物品和禮物的名稱列相關聯。

困難的部分是,關聯表的命令有一個外鍵列到一個到多個表(提升),輪到他有外鍵的禮物; 我有工作的下面的查詢,但我弄清楚,應該有一個更優雅的方式來解決這個問題不是做了很多的連接是這樣的:

select concat(c.firstName, ' ', c.lastName) as customerName, 
     i.name, g.name 
from customer as c 
left join orders as o on c.customer_id = o.customer_id 
inner join item as i on o.item_id = i.item_id 
inner join promotion as p on o.promotion_id = p.promotion_id 
inner join gift as g on p.gift_id = g.gift_id; 

我怎麼能解決一個更優雅的查詢辦法? 在此先感謝!

回答

0

我覺得這是非常優雅的。聯結非常優雅,經常被誤解。

0

您可以刪除INNER關鍵字,因爲默認情況下連接是內聯的,而AS關鍵字是可選的;也因爲你的列名是相同的跨越連接,你可以簡單地使用USING,而不是ON

SELECT CONCAT_WS(' ', c.firstName, c.lastName) customerName, 
     i.name, g.name 
FROM customer c 
    LEFT JOIN orders o USING (customer_id) 
    JOIN item  i USING (item_id) 
    JOIN promotion p USING (promotion_id) 
    JOIN gift  g USING (gift_id) 

事實上,如果這些跨連接表具有相同名稱的列只有一個可能會進一步和使用去NATURAL聯接(雖然我不喜歡這樣,因爲它隱藏了什麼事情,如果架構更改):

SELECT CONCAT_WS(' ', c.firstName, c.lastName) customerName, 
     i.name, g.name 
FROM customer   c 
    NATURAL LEFT JOIN orders o 
    NATURAL JOIN item  i 
    NATURAL JOIN promotion p 
    NATURAL JOIN gift  g 
+0

我寧願指定INNER JOIN,而不是剛剛加入,只是爲了確認這是你真正想要的東西。 –