如何从一个表返回一组值,从另一个表返回正确的唯一值?

时间:2012-03-24 17:35:38

标签: mysql sql

我是SQL新手,过去几天我一直在努力解决这个问题。

我有这两张桌子:

(抱歉,我不确定如何正确缩进或标记表格)

**Table:**
StaffNo Name    DeptNo
DAX001  Joe     DA001
DAX002  Eric    DA001
DAX003  James   DA002
DAX004  Sarah   DA002
DAX005  Simon   DA003
DAX006  Liam    DA003
DAX007  Denis   DA004
DAX008  Lisa    DA004
DAX009  Eoin    DA005
DAX010  Niall   DA005
DAX011  Richard DA006
DAX012  Steven  DA006

**Department**
DeptNo  DeptName
DA001   Security
DA002   Hospitality
DA003   Check-in
DA004   Airport Assistant
DA005   Airport Police
DA006   Maintenance

我试图弄清楚这个输出会产生的查询。

**Output**
Name     DeptName
Joe      Security
Eric     Security
James    Hospitality
Sarah    Hospitality
Simon    Check-in
Liam     Check-in
Denis    Airport Assistant
Lisa     Airport Assistant
Eoin     Airport Police
Niall    Airport Police
Richard  Maintenance
Steven   Maintenance

我从部门表中将DeptNo作为主键并且是唯一的。 我通过引用DeptNo从Staff Table中将DeptNo作为外键 来自部门表。

在其他尝试中,我尝试了以下操作,但没有一个工作。

尝试1。

SELECT Staff.Name, Department.DeptName 
FROM Staff, Department
WHERE Department.DeptNo = Staff.DeptNo;

尝试2。

SELECT Staff.Name, Department.DeptName 
FROM Staff JOIN Department
WHERE Department.DeptNo = Staff.DeptNo;

尝试3。

SELECT Staff.Name, Department.DeptName 
FROM Staff LEFT OUTER JOIN Department 
WHERE Department.DeptNo = Staff.DeptNo; 

尝试4。

SELECT Staff.Name, Department.DeptName 
FROM Staff RIGHT OUTER JOIN Department 
WHERE Department.DeptNo = Staff.DeptNo; 

当我尝试使用...时

SELECT Staff.Name, Department.DeptName 
FROM Staff, Department 
WHERE Department.DeptNo = "DAA002"
AND Staff.DeptNo = "DAA002";

..我得到了所有在他们旁边热情好客的工作人员名单,而不是旁边应该有“热情好客”的2个名单。

感谢任何帮助,并提前感谢您。

更新:

我在删除外键之前和之后都尝试了所有建议。

在删除外键之前,我大部分都是这样做的:

输出
姓名DeptName
乔安全
Eric Security
詹姆斯安全 Sarah Security
西安保安 利亚姆保安 丹尼斯安全 Lisa Security
Eoin安全 尼尔安全 理查德安全 史蒂文安全

删除外键后,我现在得到:

Joe Security
Joe Hospitality
乔办理登机手续 乔机场助理 乔机场警察
乔维护
Eric Security
Eric Hospitality
埃里克登记入住 埃里克机场助理 埃里克机场警察
Eric维护
詹姆斯安全 James Hospitality
詹姆斯登记入住 詹姆斯机场助理 詹姆斯机场警察
詹姆斯维修 Sarah Security
Sarah Hospitality
莎拉办理登机手续 莎拉机场助理
莎拉机场警察
莎拉维修
西安保安 Simon Hospitality
西蒙登记入住 西蒙机场助理 西蒙机场警察
西蒙维修
利亚姆保安 Liam Hospitality
利亚姆办理登机手续 利亚姆机场助理
利亚姆机场警察
利亚姆维护
丹尼斯安全 Denis Hospitality
丹尼斯办理登机手续 丹尼斯机场助理 丹尼斯机场警察
Denis维护
Lisa Security
Lisa Hospitality
丽莎办理登机手续 丽莎机场助理
丽莎机场警察
丽莎维修
Eoin安全 Eoin Hospitality
Eoin办理登机手续 Eoin机场助理
Eoin机场警察
Eoin维护
尼尔安全 Niall Hospitality
Niall办理登机手续 尼尔机场助理
尼尔机场警察
尼尔维护 理查德安全 Richard Hospitality
Richard Check-in
理查德机场助理 理查德机场警察
理查德维护
史蒂文安全 Steven Hospitality
史蒂文办理登机手续 史蒂文机场助理
史蒂文机场警察
史蒂文维护

到目前为止为此提供帮助。

4 个答案:

答案 0 :(得分:0)

尝试1应该有效。但是,我会将其更改为一个更明确的连接,就像您在尝试2中尝试的那样(连接子句不在哪里,而是在ON中)

SELECT Staff.Name, Department.DeptName 
FROM Staff
    JOIN Department
       ON Department.DeptNo = Staff.DeptNo;

如你所说,你是新人,review this blog post visually showing how joins work

可能会有所帮助

此外,谷歌搜索SQL JOIN可以获得关于此主题的大量知识:)

答案 1 :(得分:0)

我建议尝试

SELECT Staff.Name, Department.DeptName 
FROM Staff INNER JOIN Department 
ON Department.DeptNo = Staff.DeptNo; 

或者,如果重复输出

,您可以使用Distinct关键字
SELECT DISTINCT Staff.Name, Department.DeptName 
FROM Staff INNER JOIN Department 
ON Department.DeptNo = Staff.DeptNo; 

答案 2 :(得分:0)

尝试#2很接近。

SELECT s.Name, d.DeptName 
FROM Staff s
INNER JOIN Department d
  ON d.DeptNo = s.DeptNo

SELECT Staff.Name, Department.DeptName 
FROM Staff
INNER JOIN Department
  ON Department.DeptNo = Staff.DeptNo

如果这不起作用,你能提供你得到的输出吗?

答案 3 :(得分:0)

首先检查您的外键 - 您在上次查询中获得了笛卡尔积。 试试这个问题:

SELECT Staff.Name, Department.DeptName 
FROM Staff JOIN Department
ON Department.DeptNo = Staff.DeptNo;

这应该得到正确答案