簡體   English   中英

如何在MySQL選擇左連接中用table2列值替換table1列值

[英]How to replace table1 column value with table2 column value in MySQL select left join

假設我有兩個 MySQL 表:

table1(模板)列:id_template、name、col3、col4、...

table2(別名)列:id_alias、id_template_orig、id_user、別名

我想從 table1(模板)中選擇一行,包括所有列 (*)。 在同一個 select 語句中,我想檢查當前用戶是否為 table2 中的原始模板名稱保存了別名(別名)。 使用 LEFT JOIN 獲取包含在結果行中的別名列沒有問題,但我想知道是否有辦法將已經從 table1 中選擇的原始 name 列值替換為 table2 別名值。

所以這是到目前為止的選擇:

SELECT table1.*, table2.alias, 
CASE WHEN table2.alias IS NULL THEN table1.name ELSE table2.alias END name 
FROM table1
LEFT JOIN table2 ON table2.id_template_orig=table1.id_template 
WHERE table1.id_template='1' 

這幾乎可以正常工作,只是它返回兩個名稱列而不是用第二個替換第一個

我知道用 table1.* 選擇所有列並不是最佳實踐,我的目標將通過使用 select id_template, col3, col4, ... from table1 來實現,但有時 * 只是讓事情變得更容易。

不幸的是,在 MySQL 中沒有選擇*選項,只有一列 - 例如在 BigQuery 中,它支持select * except (name)

您有兩個選擇:

  • 不要使用select table1.* ; 相反,枚舉您想要的所有列,期望name

  • 使用select * ,並為生成的列指定不同的別名。

第二個選項可能是您的最佳選擇,因為您明確表示要保留select table1.* 它看起來像:

select t1.*, t2.alias, coalesce(t2.alias, t1.name) as new_name 
from table1 t1
left join table2 t2 on t2.id_template_orig = t1.id_template 
where t1.id_template = 1 

筆記:

  • coalesce()可以在這里替換你的case表達式

  • 表別名使查詢更易於讀寫

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM