我有一個表 attribute_name,其中一列 c_type 指示我們擁有的值的型別,例如 1,2,3,4,以便根據該值決定要加入哪個表。所以我首先選擇該表 Join (case statment) On (case statment) 但我不作業。
SELECT attribute_names.*,attributes_trans_name.*,
(CASE
WHEN attribute_names.c_type=1
THEN attribute_values_text.c_fk_files_id
WHEN attribute_names.c_type=3
THEN attribute_values_longtext.c_fk_files_id
WHEN attribute_names.c_type=8
THEN attribute_values_file.c_fk_files_id
END) as file_id
From attributes_trans_name,
attribute_names JOIN
(CASE
WHEN attribute_names.c_type=1
THEN attribute_values_text
WHEN attribute_names.c_type=3
THEN attribute_values_longtext
WHEN attribute_names.c_type=8
THEN attribute_values_file
END)
ON
(CASE
WHEN attribute_names.c_type=1
THEN attribute_values_text.c_fk_attribute_names_id
WHEN attribute_names.c_type=3
THEN attribute_values_longtext.c_fk_attribute_names_id
WHEN attribute_names.c_type=8
THEN attribute_values_file.c_fk_attribute_names_id
END) = attribute_names.c_id
WHERE
attribute_names.c_id=attributes_trans_name.c_fk_attribute_names_id
uj5u.com熱心網友回復:
使用適當的 JOIN/LEFT JOIN 背景關系,您可以在單個查詢中進行。左連接意味著我總是想要左側的記錄,但如果右側有匹配項,則為可選。因此,我已調整您的查詢以反映。我還重寫了檔案名使用“別名”名稱,因此讀取和寫入比龐大的長表名更短。
因此,主表是attribute_names,因為它似乎是將C_ID 列連接到其他列的所有連接的基礎。注意縮進可以幫助我了解/跟蹤鏈接到內容的內容,而不僅僅是批量列出的所有表格。
現在,通過讓每個左連接就位,它總是會嘗試通過外鍵鏈接到它們各自的其他表,但正如您所知,只有其中一個才能真正擁有您需要的資訊。所以你的 CASE 結構被簡化了。如果 = 1,則查看 ATV(別名)表及其列,否則 AVLT 別名 if = 3 最后是 AVF if = 8
SELECT
AN.*,
ATN.*,
CASE WHEN AN.c_type = 1
THEN ATV.c_fk_files_id
WHEN AN.c_type = 3
THEN AVLT.c_fk_files_id
WHEN AN.c_type = 8
THEN AVF.c_fk_files_id END as file_id
From
attribute_names AN
JOIN attributes_trans_name ATN
ON AN.c_id = ATN.c_fk_attribute_names_id
LEFT JOIN attribute_values_text AVT
ON AN.c_id = AVT.c_fk_attribute_names_id
LEFT JOIN attribute_values_longtext AVLT
ON AN.c_id = AVLT.c_fk_attribute_names_id
LEFT JOIN attribute_values_file AVF
ON AN.c_id = AVF.c_fk_attribute_names_id
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/315236.html
