Postgresql

困難的多向連接

  • October 14, 2020

我被要求創建(起初)似乎是一個相當簡單/直接的查詢。但是,我遇到了一些由正在查詢的表之間的連結關係引起的問題。以及來自各種不同表格的報告中包含的廣泛數據。

這是一個 postgresql 數據庫,其中包含有關銷售食品的廚師的資訊。很簡單。請求的報告查詢有關廚師的個人資訊、他們的可用菜單、這些菜單上的食物項目以及上次購買該項目的時間……位於 6-7 個不同表中的數據。

我很難以一種可以接受的方式返回數據的方式將所有這些表連接在一起。這是我正在使用的表及其連結關係的視覺化:

在此處輸入圖像描述

如您所見,一切都源自並連結回帳戶表上的使用者條目。從那裡,賣家在“商店”表上有一個條目,它連結到幾乎所有其他內容:

  • “store_address”和“address”表包含地址資訊。
  • ‘menu’ 表包含菜單的名稱——每家商店可以有多個菜單,提供特定的食物。
  • kitchen_item 表包含每個不同菜單上可用的所有特定食物項目。
  • ‘menu_item’ 表用於將 kitchen_item 表上的食物項目連結到菜單表上的菜單。
  • “訂單”跟踪每件售出商品的訂單資訊

所以我無法正確地將所有這些表連接在一起。我需要能夠顯示每個賣家(帳戶表)、他們的個人資訊(地址表)、他們的可用菜單(菜單表)、每個菜單上的項目(kitchen_items 表)以及該項目的最後銷售日期(訂單表)。

當我簡單地左連接所有內容時,每個可能的菜單都包含所有可能的食物……我嘗試了左連接、右連接、完全連接等的組合……但我認為這可能比我的技能水平高一點。 ..給定關係的佈局。

那麼,有人會好心地證明這些表可以連接在一起嗎?

連接:

select 
account.id, account.email, account.firstname, account.lastname, 
address.address, address.address_2, address.city, address.state, 
menu.name, 
kitchen_item.name, 
orders.placed
from account
left join store on account.id = store.account_id
left join menu on store.id = menu.store_id
left join menu_item on menu.id = menu_item.menu_id
left join kitchen_item on (menu_item.kitchen_item_id = kitchen_item.id and store.id = kitchen_item.store_id)
left join orders on store.id = orders.store_id
join store_address on store.id = store.address.store_id
join address on store_address.address_id = address.id
group by table.value, table.value...

當我使用上面連接的表執行查詢時,它只是缺少隨機條目……我不知道為什麼。

數據用於報告。表格“一切都在一起”或分成主題區域很好 - 儘管分成主題區域可能看起來不錯。唯一的要求是每個數據點都有一列。

我要完成的最後一部分是加入表“訂單”以獲得orders.placed 中每個已經存在的行/食品項目的最新單個條目。我想我需要寫一個子查詢?

我完全同意拆分查詢,儘管這嚴格來說是個人想要的查詢。我猜他們會希望我實現某種“當 rowcount() >1 = ’’ 時的情況”來清除所有重複的條目並將其轉換為空白。

從那以後,我已經解決了這篇文章關注的特定問題(連接)……並且已經轉向了一組新的問題。因此,為了保持文章主題,我將回答/關閉它。沒有人質疑我最終加入表格的方式或提出“更正確”或更有效的方式,所以我想我所擁有的對於這種情況可以被認為是正確的。也許登陸此頁面的其他人會發現我的視覺化圖表和隨後的連接有助於視覺化/連接他們自己的表格……誰知道呢。

無論如何,這對我有用:

from account
left join store on account.id = store.account_id
left join menu on store.id = menu.store_id
left join menu_item on menu.id = menu_item.menu_id
left join kitchen_item on (menu_item.kitchen_item_id = kitchen_item.id and store.id = kitchen_item.store_id)
join store_address on store.id = store_address.store_id
join address on store_address.address_id = address.id

引用自:https://dba.stackexchange.com/questions/276622