2016-11-27 73 views
0

我的數據庫圖...SQL無效標識在WHERE子句

https://s13.postimg.org/4rqz9purr/image.jpg

我需要列出誰曾報道比犯罪的平均數人員已報道較多每個官員的姓名。

這是我的SQL ...

SELECT 
    last, first 
FROM 
    officers 
JOIN 
    crime_officers USING (officer_id) 
JOIN 
    crimes USING (crime_id) 
JOIN 
    crime_charges USING (crime_id) 
WHERE 
    crime_charges > ALL (SELECT AVG(COUNT(*)) FROM crime_charges); 

不過,我得到這個錯誤:

invalid identifier on line 6 "crime_charges"

+0

要麼你PK你的圖上是不好的(0/1,N)或你的'crime_officers'表不應存在(0/1,1)... – Blag

+1

這是哪種RDBMS?請添加一個標籤來指定您是使用'mysql','postgresql','sql-server','oracle'還是'db2' - 或者其他的東西。 –

回答

1

此錯誤的原因是,對進入WHERE條款,您使用表名(crime_charges)而不是單個表達式。你應該通過計算由一名軍官報告的罪案數字表達式替換它:

WHERE number_of_crimes_reported_by_an_officer >ALL (SELECT AVG(COUNT(*)) FROM crime_charges) ; 

但是越來越深入到你的問題,你是正確的解決方案仍遠。如果請求的結果是一組人員,則您的查詢應直接瀏覽人員表(沒有其他連接),在WHERE子句中添加適當的條件。例如:

SELECT last, first 
FROM officers 
WHERE (compute_number_of_crimes_reported_by_an_officer) >ALL (SELECT AVG(COUNT(*)) FROM crime_charges) ; 

請參閱?通過這種方式,您將獲得官員的列表。相反,如果您將連接添加到相關表中,則記錄數將不必要地增加。

+0

現在我更加困惑。 :( – codeRed

+0

我建議你一步一步進行:首先,編碼一個查詢,計算每個軍官報告的犯罪數量:'SELECT last,first,number_of_crimes FROM officers'。然後,將所需條件添加到'WHERE'條款(你已經得到了):全球平均犯罪數量 –

1

您的查詢似乎已關閉。爲了讓每個官員犯罪的平均數(即報告了犯罪):

SELECT COUNT(*)/COUNT(DISTINCT officer_id) 
FROM crime_officers ; 

要獲得具有比平均水平的人員,使用HAVING條款:

select co.officer_id 
from crime_officers co 
group by co.officer_id 
having count(*) > (select count(*)/count(distinct officer_id) 
        from crime_officers 
       ); 

您可以使用額外的JOIN s帶來額外的列。

編輯:

也不是那麼難以得到官員的名字:

select co.officer_id, o.last, o.first 
from crime_officers co join 
    officers o 
    on co.officer_id = o.officer_id 
group by co.officer_id, o.last, o.first 
having count(*) > (select count(*)/count(distinct officer_id) 
        from crime_officers 
       ); 
+0

'SELECT co.officer_id,co.last,co.first'如果你只是想帶上全名(這兩者不加入) – Blag

+0

但我需要的名字,而不是官員ID – codeRed

+0

@codeRed正如我剛纔所說,'SELECT co.last,co.first'甚至應該工作 – Blag