SQL冗余结果

SQL冗余结果,sql,database,oracle,Sql,Database,Oracle,嘿,所以我真的被这一个查询困住了,我对SQL和Oracle是新手。所以基本上有一个包含LastName、FirstName、Email和State的数据库。我有另一个数据库,其中包含第一个数据库中的每个人都拥有的技能,每个技能都有一个ID号。我需要生成一个特定技能ID为“3”的特定人员列表,但当我这样做时,我会得到冗余信息,如中所示,相同的姓名会出现3到4次,我不希望出现这种情况 这是我使用的查询: SELECT FirstName, LastName, Email FROM CONSULTAN

嘿,所以我真的被这一个查询困住了,我对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';
任何帮助都将不胜感激

SELECT FirstName, LastName, Email
FROM CONSULTANTS, SKILLS
WHERE SKILLS.ExpertiseID = '3' AND 
( CONSULTANTS.STATE = 'NJ' OR CONSULTANTS.STATE = 'NY' );
GROUP BY FirstName, LastName, Email
使用“按分组方式”消除重复行


使用by GROUP by可消除重复行

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

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

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

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

GROUP BY或DISTINCT用于删除重复项,但是,我不确定在这种情况下,这些技能实际上是如何与顾问联系在一起的,因此此查询可能不准确。技能表中是否缺少多对多表或外键?还要注意的是,这个丢失的链接是重复链接的来源,因此当您找到该链接时,在查询中不需要GROUPBY或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');

GROUP BY或DISTINCT用于删除重复项,但是,我不确定在这种情况下,这些技能实际上是如何与顾问联系在一起的,因此此查询可能不准确。技能表中是否缺少多对多表或外键?还要注意的是,这个丢失的链接是重复链接的来源,因此当您找到该链接时,在查询中不需要GROUPBY或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或4个 每次都是,我不想那样

这是因为您的查询在技能和顾问之间没有明确的连接。所以你有一份清单,列出了纽约和新泽西州的所有顾问,以及ID为3的所有技能。事实上,你有一个产品的几个记录每个顾问向我表明,ExpertiseID不是一个唯一的关键,但没有看到的数据,我不能肯定

使用GROUP BY或DISTINCT come to的建议充其量是一个混乱,最坏的情况下是完全错误的,因为它仍然会产生错误的结果集所有顾问,而不仅仅是具有该技能的顾问。你应该用正确的方法来解决这个问题,通过使用一个连接,将顾问与他们实际拥有的技能联系起来

如果没有您的数据模型,我无法确切地告诉您如何做到这一点,但要么有一个关于技能的外键,它引用了顾问主键ConsultantID?-或者在一个理想的世界中,有一个将两者连接起来的交集表,它将被称为顾问技能。如果既没有外键也没有交集表,则数据模型已损坏,无法获得所需的结果集

我得到了多余的信息,比如,相同的名字出现了3或4个 每次都是,我不想那样

这是因为您的查询在技能和顾问之间没有明确的连接。所以你有一份清单,列出了纽约和新泽西州的所有顾问,以及ID为3的所有技能。事实上,你有一个产品的几个记录每个顾问向我表明,ExpertiseID不是一个唯一的关键,但没有看到的数据,我不能肯定

使用GROUP BY或DISTINCT come to的建议充其量是一个混乱,最坏的情况下是完全错误的,因为它仍然会产生错误的结果集所有顾问,而不仅仅是具有该技能的顾问。你应该用正确的方法来解决这个问题,通过使用一个连接,将顾问与他们实际拥有的技能联系起来


如果没有您的数据模型,我无法确切地告诉您如何做到这一点,但要么有一个关于技能的外键,它引用了顾问主键ConsultantID?-或者在一个理想的世界中,有一个将两者连接起来的交集表,它将被称为顾问技能。如果既没有外键,也没有交集表,则数据模型已损坏,无法获得所需的结果集。

谢谢!这非常有效。我不敢相信我没有想到使用“By to By”功能组是一个写不好的声明的创可贴。谢谢你的帖子。在申请小组之前,我们会三思而后行。谢谢!这非常有效。我不敢相信我没有想到使用“By to By”功能组是一个写不好的声明的创可贴。谢谢你的帖子。在申请分组前会三思而后行。您缺少一个外键。副本来自这个丢失的钥匙-基本上,你是selec
对来自NJ或NY的所有顾问进行筛选,然后对每项技能重复该操作,而不管该技能属于谁。您缺少一个外键。这些重复项来自于这个缺失的关键点——基本上,你从NJ或NY选择所有顾问,然后对每项技能重复这些,而不管该技能属于谁。这不是答案。添加表别名(无论是否为良好做法)不会改变查询的逻辑,因此也不会解决问题。这不是答案。添加表别名(无论是好的做法还是不好的做法)不会改变查询的逻辑,因此无法解决问题。