2015-08-20 114 views
0

所以目前我有兩個表,比較兩個表列,看看一個表缺少

Servers    Admins 
-------    -------- 
ServerID    AdminID 
ServerName   AdminFirstName 
Server location  AdminFirstName 
AdminID 

什麼我目前正在做的是經過AdminID列在Servers表,並將其比作AdminID列中的Admins表。 我試圖做的比較是「哪些管理員尚未分配給服務器?」和「哪些服務器沒有分配給他們的管理員?」

我曾嘗試以下(嘗試的第一個問題):

SELECT CONCAT(AdminLastName,',',AdminFirstName) 
FROM Admins 
WHERE AdminID NOT IN(SELECT AdminID FROM Servers) 

該查詢返回的結果0,當它應該返回幾個。因爲這兩個問題都可以用幾乎相同的邏輯來回答,所以我只需要朝着正確的方向推動爲什麼這不起作用。

在此先感謝

+0

您的查詢看起來第一眼看上去是正確的:O – Kritner

+0

@Kritner這就是我的想法。但它沒有返回任何結果! – OysterMaker

+0

尾隨空格會有問題嗎? –

回答

1

你的查詢看起來正確的給我,但我傾向於儘量避免NOT IN可能的情況下,我通常會得到更好的表現出一個查詢這樣寫:

select adminId, adminfirstname, adminlastname 
from admins a 
left join servers s on a.adminId = s.adminId 
where s.adminId is null 

的以上是相同的想法,只是使用連接並只顯示未成功連接的結果。

select serverId, serverName, [server location] 
from servers 
where adminId is null 
+0

這個伎倆!謝啦! – OysterMaker

0

您的查詢似乎是正確的:因爲

另一個可以寫。

這可能是由於幾件事情:

  • 所有管理員實際上是分配給服務器

  • 你不正確的數據庫上執行查詢...

  • 有ID列的內容有問題:如果它不是INTEGER,它可以在兩個表中的一箇中包含空格或其他不需要的字符,並且與數據庫系統不匹配。嘗試TRIM()的Id的例如

  • 根據您的數據庫系統,它可以更好,因爲你在多個表

例如具有相同的字段名稱明確寫入表名稱:

SELECT CONCAT(AdminLastName,',',AdminFirstName) 
FROM Admins 
WHERE TRIM(Admins.AdminID) NOT IN(SELECT TRIM(Servers.AdminID) FROM Servers)