2013-05-06 104 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)。如果您既没有外键,也没有交点表,那么您的数据模型就会失效,并且无法获得所需的结果集。