SQL冗余结果

时间:2013-05-06 06:23:47

标签: sql database oracle

嘿所以我真的被这个查询困住了,我是SQL和Oracle的新手。所以基本上有一个包含LastName,FirstName,Email和State的数据库。我有另一个数据库,其中包含来自第一个数据库的每个人都有的技能,每个技能都有一个ID号。我需要生成一个具有特定技能ID('3')的特定人员列表,但是当我这样做时,我得到了多余的信息,因为同样的名字每次出现3或4次,我不希望这样

这是我使用的查询:

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

任何帮助都会受到重视

4 个答案:

答案 0 :(得分:3)

  

“我得到了多余的信息,就像在同一个名字中出现3或4   每次我都不想要那个“

那是因为您的查询在SKILLS和CONSULTANTS之间没有明确的联接。所以你所拥有的是纽约和新泽西州所有顾问的名单交叉加入,其中包含ID为3的所有技能。每个顾问都有几个记录产品的事实告诉我ExpertiseID不是唯一的密钥,但没有看到我无法确定的数据。

使用GROUP BY(或DISTINCT来)的建议充其量只是一个问题,最糟糕的是错误,因为它仍会产生错误的结果集(所有顾问,而不仅仅是具有该技能的顾问)。您应该通过使用将顾问与他们实际拥有的技能联系起来的联接以正确的方式解决这个问题。

如果没有您的数据模型,我无法确切地告诉您如何执行此操作,但是SKILLS上有一个外键引用了CONSULTANT主键 - ConsultantID? - 或者有一个连接两者的交叉表(在理想的世界中,它将被称为CON​​SULTANT_SKILLS)。如果您既没有外键也没有交集表,那么您的数据模型就会破碎,并且无法获得所需的结果集。

答案 1 :(得分: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

GROUP BY使用消除重复行

答案 2 :(得分: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 :(得分:-1)

给出了给定表的别名..这是一个很好的数据库体验.. 您可以尝试此查询

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