2013-04-24 215 views
0

是否可以向AS添加WHERE語句?當我像這樣運行sql總是失敗。我只是需要某種示例,而且從搜索中找不到任何東西。將WHERE添加到SQL中的AS語句中

SELECT *, 
COUNT(my_other_table.id) as 'c_others' WHERE my_other_table.active = 1 
LEFT JOIN my_other_table on my_accounts.id = my_other_table.account_connection 
FROM my_accounts 
ORDER BY my_accounts.name 

注意我如何添加WHERE my_other_table.active = 1,這就是我打破一切

我不是100%確定如何AS語句的工作,平時我不會做任何與複雜他們。但現在,我需要,我不知道它

+0

有一個SQL的設置結構,必須堅持或系統不知道你在做什麼@Till答案是最好的,看到的語法和特定的結構;) – glh 2013-04-24 10:59:53

回答

5

A WHERE子句必須在表列表的末尾,在可選的ORDER BY之前。看看這個定義SELECT語句必須堅持以結構:

SELECT 
[ DISTINCT | ALL ] 
    <select list> 
    FROM <table reference list> 
[ <where clause> ]    <-- THIS IS THE INTERESTING PART 
[ <group by clause> ] 
[ <having clause> ] 
[ UNION [ALL] <query specification> ] 
[ <order by clause> ] 

所以您的查詢應該是這樣的:

SELECT *, COUNT(my_other_table.id) AS c_others 
FROM my_accounts 
LEFT JOIN my_other_table ON my_accounts.id = my_other_table.account_connection 
WHERE my_other_table.active = 1 
ORDER BY my_accounts.name 

您也可以在條件添加到您的ON條款:

SELECT *, COUNT(my_other_table.id) AS c_others 
FROM my_accounts 
JOIN my_other_table ON 
    my_accounts.id = my_other_table.account_connection 
    AND my_other_table.active = 1 
ORDER BY my_accounts.name 

AS語句除了爲選定字段指定別名外別無其他。當字段名太長時,您希望爲函數調用定義名稱(例如COUNT(column) AS counter,就像您使用過的名稱),或者在連接具有相似列名稱的表時避免名稱衝突,這會非常有用。您還可以使用AS指定表名的別名,以避免必須多次鍵入它。

編輯:

如由HamletHakobyan的評論中指出:COUNT的是,可能需要您使用GROUP BY子句在發言中選擇其他字段的聚合函數。所以,你需要擴大*到實際字段名,做這樣的:

SELECT 
    my_accounts.name, 
    my_accounts.firstname, 
    COUNT(my_other_table.id) AS c_others 
FROM my_accounts 
JOIN my_other_table ON 
    my_accounts.id = my_other_table.account_connection 
    AND my_other_table.active = 1 
GROUP BY my_accounts.name, my_accounts.firstname 
ORDER BY my_accounts.name 
+1

如果你在SQL Server中不能不分組就可以做到這一點。 – 2013-04-24 10:57:05

+0

+1對**這是有趣的部分**;) – glh 2013-04-24 11:00:52

+0

@HamletHakobyan真的。我會補充一點。 :) – 2013-04-24 11:03:45

0

你可以只添加WHERE子句:

SELECT *, 
    COUNT(my_other_table.id) as 'c_others' 
FROM my_accounts 
    LEFT JOIN my_other_table 
     ON my_accounts.id = my_other_table.account_connection 
WHERE my_other_table.active = 1 
GROUP BY <list all necessary fields> 
ORDER BY my_accounts.name 

,或者,如果你想獲得的選擇性計數元件使用此

SELECT <list all necessary fields>, 
    COUNT(CASE WHEN my_other_table.active = 1 THEN my_other_table.id END) as 'c_others' 
FROM my_accounts 
    LEFT JOIN my_other_table 
     ON my_accounts.id = my_other_table.account_connection 
GROUP BY <list all necessary fields> 
ORDER BY my_accounts.name 
0

AS僅僅引入了一個新名稱一個對象(列,表等)。因此,將WHERE應用於它是沒有意義的(因爲在此實例中列的名稱)對於整個結果集是固定的。

在猜測,你實際上要修改的COUNT,讓你只計算那些行,其中active爲1:

SELECT *, 
SUM(CASE WHEN my_other_table.active = 1 THEN 1 ELSE 0 END) as 'c_others' 
LEFT JOIN my_other_table on my_accounts.id = my_other_table.account_connection 
FROM my_accounts 
ORDER BY my_accounts.name 
0

AS只是給一個名字列關鍵字。這在複雜的列定義中很方便。名稱只能在查詢結果中使用,但不能在查詢中使用 - 不能在同一個查詢中引用它。那麼你必須使用子查詢。

WHERE(以及其他關鍵字)在Till Helge寫下的查詢中佔據了他們的位置。