2012-03-12 97 views
2

我已經在各種數據庫管理系統(Oracle,SQL Server,MySQL,Access等)上編寫SQL了很多年了,有一件事情總是讓我感到似乎缺乏當涉及到表&子查詢別名時的命名約定。SQL表/子查詢別名約定

我一直在讀取表格alises是要走的路,儘管我並不總是使用它們,但是當我做這些事時,我總是卡在要使用的名稱之間。我已經從使用描述性名稱到單個字符,如「t」,「s」或「q」,然後再返回。舉個例子,我剛剛寫的這個MS Access查詢,即使對於一個相對簡單的查詢,我仍然不完全滿意我使用的別名,因爲我仍然不認爲這很容易閱讀:

SELECT stkTrans.StockName 
    , stkTrans.Sedol 
    , stkTrans.BookCode 
    , SUM(IIF(stkTrans.TransactionType="S", -1 * stkTrans.Units, 0)) AS [Sell Shares] 
    , SUM(IIF(stkTrans.TransactionType="B", stkTrans.Units, 0)) AS [Buy Shares] 
    , SUM(IIF(stkTrans.TransactionType="B", -1 * stkTrans.Price, 0) * stkTrans1.Min_Units) + SUM(IIF(stkTrans.TransactionType="S", stkTrans.Price, 0) * stkTrans1.Min_Units) AS [PnL] 
    , "" AS [Comment] 
FROM tblStockTransactions AS stkTrans 
INNER JOIN (SELECT sT1.BookCode 
        , sT1.Sedol 
        , MIN(sT1.Units) AS [Min_Units] 
      FROM tblStockTransactions sT1 
      GROUP BY sT1.BookCode, sT1.Sedol 
      HAVING (SUM(IIF(sT1.TransactionType="S", 1, 0)) > 0 
      AND SUM(IIF(sT1.TransactionType="B", 1, 0)) > 0)) AS stkTrans1 ON (stkTrans.BookCode = stkTrans1.BookCode) AND (stkTrans.Sedol = stkTrans1.Sedol) 
GROUP BY stkTrans.BookCode, stkTrans.StockName, stkTrans.Sedol; 

您怎麼看?以爲我會把它扔出去看看別人的感受是什麼。

回答

2

我不知道任何有關跨數據庫命名錶/查詢別名的規範樣式規則,儘管我知道Oracle建議使用三到四個字符的縮寫。

我會通常繞開單字母縮寫的,除了其中查詢是足夠簡單的是,這些應該是完全明確的,以具有以維持代碼任何人 - 通常不每個查詢超過兩個或三個表。

我通常也會避免使用符合數據庫表格命名約定的一般風​​格的長名稱,因爲它可能會變得不清楚什麼是數據庫表名和什麼是別名。

在提供的示例中,內聯視圖中的別名sT1是完全不必要的,因爲在該內聯視圖內只有一個表被訪問。這使得一個表被連接到查詢中的一個內聯視圖中(基於同一個表) - 在這種情況下,我將使用s作爲表的別名,並使用s1作爲內聯視圖的別名(以表示它正在查詢相同的底層數據庫表)。

+1

「裏面的別名ST1 ..rather內聯視圖是完全不必要的「 - AFAIK這裏的想法是它有助於未來的發展,即當(如果不是!)第二個表需要被添加到查詢中,那麼相關名已經存在,源代碼控制比較等。當然,[YAGNI](http://www.google.co.uk/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ctl=1331551355915&ved=0CDQQFjAA&url=http%3A%2F %2Fen.wikipedia.org%2Fwiki%2FYou_ain't_gonna_need_it&ei = etxdT9_-Gui-0QXhx62GAg&usg = AFQjCNHaDCOVQWLpBfX1NqScK8nJ-kZ8FQ)但這就是我的想法;) – onedaywhen 2012-03-12 11:22:55

+0

這正是我的觀點。我有時會爲像ST1這樣的內聯視圖添加別名,但並非總是如此。就在我目前正在工作的地方發生這是一個'規則',我們總是使用別名的一切! – markblandford 2012-03-12 11:38:28

0

如果我使用的是SQL Server,我可能會把派生表放在一個Common Table Expression (CTE)中,並用一個邏輯名稱(表示表的內容),然後用主查詢中的相關名稱(「表別名」)縮短它(以幫助閱讀)例如

WITH StockTransactions__type_S_or_B__smallest_units 
    AS 
    (
     <derived table query here> 
    ) 
SELECT stkTrans.StockName 
     ... 
FROM tblStockTransactions AS stkTrans 
INNER JOIN StockTransactions__type_S_or_B__smallest_units AS stkTrans1 
    ON (stkTrans.BookCode = stkTrans1.BookCode) AND (stkTrans.Sedol = stkTrans1.Sedol) 
GROUP BY stkTrans.BookCode, stkTrans.StockName, stkTrans.Sedol; 

顯然,這樣你就直接去相關的姓名和完全失去了全名,這不是在Access中的一個選項。這不是理想的但是可以接受的,IMO。


SQL無需任何理由就要求將名稱分配給派生表。從Hugh Darwen這個例子中,我認爲我們可以有把握地認爲有義務惹惱了他:

SELECT DISTINCT E#, TOTAL_PAY 
FROM (SELECT E#, SALARY + BONUS AS TOTAL_PAY 
FROM EMP) AS TEETH_GNASHER 
WHERE TOTAL_PAY >= 500 

就個人而言,對於這樣一個毫無意義的要求,我選擇了幾乎是毫無意義的,沒有爭議的名字,DT1是第一派生表的收縮並允許例如DT2,DT3等

SELECT DISTINCT E#, TOTAL_PAY 
FROM (SELECT E#, SALARY + BONUS AS TOTAL_PAY 
FROM EMP) AS DT1 
WHERE TOTAL_PAY >= 500 
+0

完全同意使用派生表。幸運的是,我不必面對太多的MS Access開發。 – markblandford 2012-03-12 11:41:02

0

DT1和DT2似乎是好方法.. 我在理解現有的程序階段,一些 程序使用此命名約定DT1,DT2 .. 它變得相當簡單的瞭解比給一些表短名稱別名