我不習慣查詢句子,這個有點棘手,我不知道是否有可能(至少只有一個 sql 查詢)或者我是否應該將問題名稱更改為更準確的名稱,如果所以讓我知道。
我有兩張桌子,我會讓它們變得簡單。第一個是關于游戲的,有一個名字和一個details_id,另一個關于游戲細節的有details_id(外鍵),locale和description。
| 游戲 |
|---|
| 姓名 |
| details_id |
| 細節 |
|---|
| details_id |
| 語言環境 |
| 描述 |
一個游戲可以有多個關聯的細節,因為它們details_id不是唯一的。因此,我可以將 3 個具有相同 ID 的詳細資訊表關聯到一個游戲,但沒有與details_id其他游戲相同的游戲。我舉個例子:
游戲
| 姓名 | details_id |
|---|---|
| 馬里奧賽車 | 007 |
細節
| details_id | 語言環境 | 描述 |
|---|---|---|
| 007 | 英文版 | 一款不錯的賽車游戲。 |
| details_id | 語言環境 | 描述 |
|---|---|---|
| 007 | ES-ES | Un buen juego de carreras。 |
我在一個視圖中顯示了所有的游戲及其英文描述,它們現在按描述排序如下:
SELECT Games.name, Details.description
FROM Games
INNER JOIN Details ON Details.locale='en-GB'
訣竅是我希望它依賴于語言環境,它們可能是沒有被翻譯成與其他語言相同的語言環境的游戲。
目標是一個選擇,通過一個連接,可以選擇所有按descriptionlocale is排序的游戲名稱和細節描述es-ES,如果細節不存在,它將en-GB在西班牙描述中按字母順序排列。
uj5u.com熱心網友回復:
在這里,我添加了第二個只有英文描述的游戲。我們加入詳細資訊表兩次,一次提取英文描述,一次提取西班牙描述。我們使用函式 COALESCE 回傳第一個非空值,即。如果有西班牙語,如果沒有西班牙語,則為英語。
請參閱底部的 dbFiddle 鏈接以了解架構并進一步測驗。
select * from games; select * from details;姓名 | details_id :----------- | ---------: 馬里奧賽車 | 7 忍者大戰 | 5 details_id | 語言環境 | 描述 ---------: | :----- | :------------- 7 | zh-CN | 一款不錯的賽車游戲。 7 | ES-ES | Un buen juego de carreras。 5 | zh-CN | 一款街頭格斗游戲。
select name, coalesce(esp.description, eng.description) Description from games g left join (select details_id, description from details where locale = 'en-GB') eng on g.details_id = eng.details_id left join (select details_id, description from details where locale = 'es-ES') esp on g.details_id = esp.details_id姓名 | 描述 :----------- | :------------- 馬里奧賽車 | Un buen juego de carreras。 忍者大戰 | 一款街頭格斗游戲。
db<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/446051.html
標籤:sql PostgreSQL
