1

嘿,所以我真的被这个查询困住了,而且我是 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

4 回答 4

3

“我得到了多余的信息,例如,同一个名字每次出现 3 或 4 次,我不希望这样”

那是因为您的查询在 SKILLS 和 CONSULTANTS 之间没有显式连接。因此,您所拥有的是纽约和新泽西交叉加入的所有顾问的列表,其中包含 ID 为3. 您拥有每位顾问多条记录的产品这一事实向我表明,这ExpertiseID不是唯一的密钥,但没有看到我无法确定的数据。

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

如果没有您的数据模型,我无法确切告诉您如何执行此操作,但是 SKILLS 上是否有一个外键引用了 CONSULTANT 主键 - ConsultantID?- 或者有一个将两者连接起来的交集表(在理想情况下,它将被称为 CONSULTANT_SKILLS)。如果您既没有外键也没有交集表,那么您的数据模型就会损坏,并且没有机会获得所需的结果集。

于 2013-05-06T06:48:14.740 回答
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');
于 2013-05-06T06:38:38.260 回答
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 使用以消除重复行

于 2013-05-06T06:26:21.080 回答
-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';
于 2013-05-06T06:29:39.360 回答