2011-04-08 55 views
1

以下是數據庫的模式:http://i.stack.imgur.com/omX60.png幫助構建查詢(提供的模式)

哪家公司擁有最少的權利?

請告訴我我的答案是多麼的錯誤。

select top 1 companyName 
serialNumber_tbl as sn, Entitlement_tbl as ent, Company_tbl as c 
where sn.serialNumberId = ent.serialNumberId 
and c.companyId = sn.companyId 
order by count(distinct entitlementId) asc 
group by companyName 

謝謝。

回答

1

幾乎是正確的,我想。缺少FROM關鍵字,而GROUP BY必須在ORDER BY之前。

select top 1 companyName 
from serialNumber_tbl as sn, Entitlement_tbl as ent, Company_tbl as c 
where sn.serialNumberId = ent.serialNumberId 
and c.companyId = sn.companyId 
group by companyName 
order by count(distinct entitlementId) asc 
1
select top 1 companyName 
**from** serialNumber_tbl as sn, Entitlement_tbl as ent, Company_tbl as c 
where sn.serialNumberId = ent.serialNumberId 
and c.companyId = sn.companyId 
group by companyName 
order by count(distinct entitlementId) asc 
1

其他的答案都正確地指出,缺少from關鍵字和group byorder by條款的順序錯誤。遵循你到達那裏的建議應該沒有問題。

另一件事是你用來連接表的語法。雖然從技術上講不是一個錯誤,但它被認爲是過時的。較新的標準提供了專門的加入關鍵字,它允許您將加入邏輯與按值過濾邏輯分開,以前根據舊標準,必須將其混合在一個子句WHERE子句中。

讓我通過重寫FROMWHERE子句來展示此內容,以便您可以看到差異。首先,這裏是你的當前連接的邏輯實現:

FROM serialNumber_tbl AS sn, 
    Entitlement_tbl AS ent, 
    Company_tbl AS c 
WHERE sn.serialNumberId = ent.serialNumberId 
    AND c.companyId = sn.companyId 

WHERE子句中的兩個條件是連接條件。下面是相同的代碼片段時,與新的語法進行修改:

FROM serialNumber_tbl AS sn 
    INNER JOIN Entitlement_tbl AS ent ON sn.serialNumberId = ent.serialNumberId 
    INNER JOIN Company_tbl AS c ON c.companyId = sn.companyId 

在這種情況下,WHERE條款完全消失了,當然,但你不應該有錯誤的印象是,它總是這樣。通常WHERE條款仍然有效且有用。如果它包含一些不屬於加入邏輯的其他條件,則它們將在WHERE子句中保留那些位置。我在談論像ent.Date < '19900101' AND c.CompanyName NOT IN ('IBM', 'Microsoft')這樣的條件。

就像我之前所說的那樣,使用目前使用的較舊的語法,該條件將與連接條件在一個子句中。在更簡單的情況下,像您的情況一樣,它可能會被忽略而沒有問題,但在更復雜的查詢中,如果不是可怕的話,它可能成爲一個問題,即使不是噩夢。所以重點是在開始編寫這樣複雜的查詢之前習慣新的語法。

+0

謝謝!我學到了新的東西=) – Donut 2011-04-13 04:13:59