我已经在各种DBMS(Oracle,SQL Server,MySQL,Access等)上编写了多年的SQL,而且一直让我印象深刻的是,当它到来时似乎缺乏命名约定到表&子查询别名。
我一直都认为桌子是理所当然的,虽然我还没有使用它们,但是当我这样做时,我总是卡在要使用的名字之间。我已经从使用描述性名称变成单个字符,例如“' t' s' 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;
你怎么看?我以为我会把它扔出去看看其他人的感受是什么。
答案 0 :(得分:2)
我不知道在数据库中命名表/查询别名的任何规范样式规则,但我知道Oracle建议使用三到四个字符的缩写。
我通常避开单字母缩写,除了,其中查询足够简单,以至于对于任何需要维护代码的人来说,这些应该是完全明确的 - 通常没有每个查询超过两个或三个表。
我通常也会避免使用符合数据库表命名约定的一般样式的长别名,因为它可能会变得不清楚什么是数据库表名和什么是别名。
在提供的示例中,内联视图中的别名sT1
完全没必要,因为在该内联视图中只能访问一个表。这使得一个表连接到查询中的一个内联视图(基于同一个表) - 在这种情况下,我会使用s
作为表的别名,s1
作为别名内联视图(表示它正在查询相同的底层数据库表)。
答案 1 :(得分: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
答案 2 :(得分:0)
DT1和DT2似乎是一个很好的方法.. 我正在理解现有的程序和一些程序 程序使用此命名约定DT1,DT2 .. 理解它变得相当简单。而不是将一些表短名称作为别名