0

我目前正在尝试SELECT使用 3 个表编写语句JOIN。但我似乎无法让 select 语句从 3 个表中输出我想要的值

这是构成我的表格的示例:

申请表
APPNUM APPNAME


A0001 Derrick Tan
A0002 Eugene Loh
A0003 Samuel Lim
A0004 Ann Chan A0005
Jourdan Wee A0006
Linda Koh
A0007 Veronica Lim
A0008 Junaida Bte Ismail
A0009 Gene Tan
A0010 Rupesh Subramaniam
A0011 Muhammad Farid

技能桌
SKILLPOSAP SKILLPOSSKILL


A0001 SK001
A0001 SK003
A0001 SK005
A0001 SK006
A0001 SK201
A0001 SK301
A0002 SK107
A0002 SK108
A0002 SK202

技能表
SKILLNEEDE SKILLNEEDEDSKILL


P0001 SK001
P0001 SK005
P0001 SK006
P0001 SK201
P0001 SK301

如您所见,我需要根据 Skillneeded 的 Skillneededposnum 值从申请人那里检索值 appnum 和 appname。所以链接是从 Skillneeded 到 Skillpossessed 到申请人。使用JOIN,我可以检索 appnum n appnames 但它们是重复值!

这是选择语句:

SELECT APPNUM,APPNAME
FROM APPLICANT A
LEFT JOIN SKILLPOSSESSED B
ON A.APPNUM = B.SKILLPOSAPPNUM
LEFT JOIN SKILLNEEDED C
ON B.SKILLPOSSKILL = C.SKILLNEEDEDSKILL
WHERE C.SKILLNEEDEDPOSNUM = 'P0001';

这是一个结果示例:

APPNUM APPNAME


A0001 Derrick Tan
A0001 Derrick Tan
A0001 Derrick Tan
A0001 Derrick Tan
A0001 Derrick Tan
A0003 Samuel Lim
A0003 Samuel Lim
A0003 Samuel Lim
A0004 Ann Chan
A0004 Ann Chan A0005
Jourdan Wee

显示的结果只能是 的单行A0001 Derrick Tan

编辑:这个过程是从技能需要到技能处理再到申请人。'P0001' 将从 Skillneeded 表中获取 5 个 'SK---' 数据。从那里 5 'SK---' 数据将从 Skillprocessed 表中检索 'A0001'。最后,“A0001”将从申请表中检索名称。

我应该如何修改我现有的 sql 语句来实现这一点?或者有没有比使用更好的方法来做到这一点JOIN

感谢所有的帮助!

4

1 回答 1

0

也许是这样的?

SELECT Applicant.APPNUM, Applicant.APPNAME, COUNT(*) AS SkillCount
FROM Applicant
  INNER JOIN Skillpossessed ON Applicant.APPNUM = Skillpossessed.SKILLPOSAP
  INNER JOIN Skillneeded ON Skillpossessed.SKILLPOSSKILL = Skillneeded.SKILLNEEDEDSKILL
WHERE Skillneeded.SKILLNEEDE = 'P0001'
GROUP BY Applicant.APPNUM
ORDER BY SkillCount DESC;

它将给出以下输出:

APPNUM  APPNAME      SKILLCOUNT
A0001   Derrick Tan  5

基本上,它会找到已经具备 Skillsneeded 表中列出的技能的申请人,并显示他们拥有该表中的技能数量。它使用 Group By 为每个申请人获取一行,然后按降序排序,将技能最多的人排在最前面。在这种情况下,唯一拥有 Skillsneeded 表中任何技能的申请人是 Derrick Tan,因此他是唯一的结果。

SQL Fiddle 链接:http ://sqlfiddle.com/#!2/58d67/17

编辑- 要仅获得 SkillCount 为 5 的结果,您可以这样做:

SELECT *
FROM (SELECT Applicant.APPNUM, Applicant.APPNAME, COUNT(*) AS SkillCount
      FROM Applicant
        INNER JOIN Skillpossessed ON Applicant.APPNUM = Skillpossessed.SKILLPOSAP
        INNER JOIN Skillneeded ON Skillpossessed.SKILLPOSSKILL = Skillneeded.SKILLNEEDEDSKILL
      WHERE Skillneeded.SKILLNEEDE = 'P0001'
      GROUP BY Applicant.APPNUM) T1
WHERE SkillCount = 5;

SQL 小提琴链接:http ://sqlfiddle.com/#!2/58d67/22

于 2013-10-30T20:37:07.463 回答