2013-05-06 108 views
0

嘿所以我真的堅持這一個查詢,我是SQL和Oracle的新手。所以基本上有一個姓氏,名字,電子郵件和國家的數據庫。我有另一個數據庫,其技能是來自第一個數據庫的每個人都有技能,每個技能都有一個ID號。我需要列出具體技能ID('3')的特定人員,但是當我這樣做時,我會得到冗餘信息,因爲同樣的名字每次出現3到4次,我不希望這樣。SQL冗餘結果

這是我使用的查詢:

SELECT FirstName, LastName, Email 
FROM CONSULTANTS, SKILLS 
WHERE SKILLS.ExpertiseID = '3' AND CONSULTANTS.STATE = 'NJ' 
OR CONSULTANTS.STATE = 'NY'; 

任何幫助將認真領會由GROUP BY

+0

你在這裏缺少一個外鍵。重複項來自於這個缺失的關鍵 - 基本上,你選擇了來自新澤西州或紐約的所有顧問,然後爲每項技能重複這一點,而不管該技能屬於誰。 – 2013-05-06 06:47:57

回答

1
SELECT FirstName, LastName, Email 
FROM CONSULTANTS, SKILLS 
WHERE SKILLS.ExpertiseID = '3' AND 
(CONSULTANTS.STATE = 'NJ' OR CONSULTANTS.STATE = 'NY'); 
GROUP BY FirstName, LastName, Email 

用來消除重複行

+0

謝謝!這工作完美。我不敢相信我沒有想過使用'GROUP BY'功能 – bloodstorm17 2013-05-06 06:30:24

+0

很高興我能幫上忙。 PLZ標記爲正確答案。謝謝 – 2013-05-06 06:31:10

+1

GROUP BY是一個寫得很差的聲明的創可貼。 – APC 2013-05-06 07:06:35

0

具有給定的別名表..這是一個很好的數據庫體驗.. 你可以試試這個查詢

SELECT c.FirstName, c.LastName, c.Email 
FROM CONSULTANTS c, SKILLS s 
WHERE s.ExpertiseID = '3' AND c.STATE = 'NJ' 
OR c.STATE = 'NY'; 
+0

這不是一個答案。添加表別名 - 好的做法或不 - 不會改變查詢的邏輯,所以不能解決問題。 – APC 2013-05-06 08:13:40

1

GROUP BY或DISTINCT用於刪除重複項,但是,我不確定技巧是如何與此顧問實際綁定的,因此此查詢可能不準確。在技​​能列表中,我是否缺少多個表或者外鍵?還要注意,這個缺失的鏈接是你的重複的來源,所以當你得到這個鏈接時,你不需要查詢中的GROUP BY或DISTINCT。

SELECT C.FirstName, C.LastName, C.Email 
FROM CONSULTANTS C 
JOIN SKILLS S ON C.CustomerId = S.CustomerId -- need a join clause that ties the Skill to the Consultant 
WHERE C.STATE IN ('NJ', 'NY') AND S.ExpertiseID = 3; 

要解決您的原始查詢,只需省略技能表。

SELECT C.FirstName, C.LastName, C.Email 
FROM CONSULTANTS C 
WHERE C.STATE IN ('NJ', 'NY'); 
3

「我得到的冗餘信息,如,同一個名字出現每3或4 次,我不希望這樣」

那是因爲你查詢不SKILLS和CONSULTANTS之間有明確的聯繫。所以你有什麼是在紐約和新澤西所有的顧問名單交叉加入與ID爲3的所有技能。事實上,你有每個顧問幾個記錄的產品暗示我ExpertiseID不是一個獨特的關鍵,但沒有看到我無法確定的數據。

建議使用GROUP BY(或DISTINCT來說明),因爲它仍然會產生錯誤的結果集(所有顧問,而不僅僅是具有該技能的顧問),因此最好不過了。你應該用適當的方式解決這個問題,通過使用一個連接顧問來連接他們實際擁有的技能。

如果沒有您的數據模型,我無法確切地告訴您如何執行此操作,但是SKILLS上的外鍵引用了CONSULTANT主鍵 - ConsultantID? - 或者有一個交匯點表連接兩個(在一個理想的世界中它將被稱爲CON​​SULTANT_SKILLS)。如果您既沒有外鍵,也沒有交點表,那麼您的數據模型就會失效,並且無法獲得所需的結果集。