Stored-Procedures

表別名是一種不好的做法嗎?

  • May 12, 2020

我記得在為資訊服務碩士學生開設的 DBMS 課程中學習如何做到這一點。為了節省一些輸入,您可以輸入:

SELECT t1.id, t2.stuff 
FROM 
             someTable    t1 
  INNER JOIN otherTable   t2 
     ON t1.id=t2.id
;

但是……為什麼這在儲存過程等中是可以接受的?似乎它所做的只是損害了語句的可讀性,同時節省了極少的時間。這樣做是否有任何功能或邏輯原因?它似乎增加而不是消除歧義;我可以看到使用這種格式的唯一可接受的原因是如果您添加了一個語義上有意義的別名——例如FROM someTable idsTable——當表名描述性不夠時。

表別名是一種不好的做法,還是只是濫用有用的系統?

表別名是一種常見且有用的做法。

  • 在查詢中的任何位置引用列時**,它可以節省您的擊鍵次數。**
  • 當您引用許多表時,**它提高了 SQL 的可讀性。**別名讓您可以給這些表起一個簡短的名稱,並為它們的使用方式提供一些含義。
  • **當您將一個表連接到自身或多次連接到同一個表時,它甚至是必需的。**這是為了讓查詢優化器在您提及列時知道您引用的是哪個表。

以下報告摘錄很好地說明了上述所有要點:

INSERT INTO reporting.txns_extract
SELECT 
   -- 30+ columns snipped
   -- 
   -- Would you want to type out full table names for each 
   -- column here?
FROM 
   -- ... and in the JOIN conditions here?
               billing.financial_transactions  ft_cdi   -- alias required here
   INNER JOIN  
               billing.cash_application_links  cal
           ON  ft_cdi.key_num = cal.applied_ft_key_num
   INNER JOIN  
               billing.financial_transactions  ft_pmt   -- alias required here
           ON  cal.owner_key_num = ft_pmt.key_num
   LEFT OUTER JOIN
               billing.invoice_lines           invl
           ON  ft_cdi.key_num = invl.invoice_key_num
   LEFT OUTER JOIN
               billing.charges                 chrg
           ON  invl.creator_key_num = chrg.key_num
   LEFT OUTER JOIN
               billing.customer_services       cs
           ON  chrg.cs_key_num = cs.key_num
   INNER JOIN
               billing.billers                 bil
           ON  ft_cdi.biller_account_key_num = bil.biller_account_key_num
   INNER JOIN
               billing.formal_entities         fe
           ON  bil.frml_key_num = fe.key_num
WHERE
   -- ... and in the WHERE conditions here?
       ft_cdi.transaction_type <> 'Payment'   -- alias tells me this table is not for payments
   AND ft_cdi.status = 'Approved'
   AND ft_pmt.transaction_type =  'Payment'   -- alias tells me this table is for payments
   AND ft_pmt.status = 'Approved'
   AND ft_cdi.last_user_date >   ft_last_user_date_begin
   AND ft_cdi.last_user_date <=  ft_last_user_date_end
;

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