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

Mysql 如何从一个表返回一组值,从另一个表返回正确的唯一值?,mysql,sql,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 Lis

我是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
我已将Department表中的DeptNo作为主键和唯一键。 我已经通过引用DeptNo将Staff表中的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";
…我得到的是一份旁边有热情好客的所有员工的名单,而不是一份旁边应该有热情好客的两个人的名单

感谢您的帮助,并提前向您表示感谢

更新:

在删除外键之前和之后,我已经尝试了您的所有建议

在删除外键之前,我得到的大部分信息是:

输出 姓名 乔安全 埃里克安全 詹姆斯安全 莎拉安全 西蒙安全 利亚姆安全 丹尼斯保安公司 丽莎安全 安全问题 尼尔安全 理查德安全 史蒂文安全

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

乔安全 乔酒店 乔登记 乔机场助理 乔机场警察 乔维修 埃里克安全 埃里克酒店 埃里克登记 埃里克机场助理 埃里克机场警察 埃里克维修 詹姆斯安全 詹姆斯酒店 詹姆斯登记 詹姆斯机场助理 詹姆斯机场警察局 詹姆斯维修 莎拉安全 莎拉酒店 莎拉登记入住 莎拉机场助理 莎拉机场警察 莎拉维修 西蒙安全 西蒙酒店 西蒙登记入住 西蒙机场助理 西蒙机场警察局 西蒙维修 利亚姆安全 利亚姆酒店 利亚姆登记 利亚姆机场助理 利亚姆机场警察局 利亚姆维修 丹尼斯保安公司 丹尼斯酒店 丹尼斯登记 丹尼斯机场助理 丹尼斯机场警察局 丹尼斯维修 丽莎安全 丽萨酒店 丽莎登记 丽莎机场助理 丽莎机场警察 Lisa维护 安全问题 伊欧酒店 办理登机手续 机场助理 机场警察局 Eoin维护 尼尔安全 尼尔酒店 尼尔登记入住 尼尔机场助理 尼尔机场警察局 尼尔维修 理查德安全 理查德酒店 理查德登记 理查德机场助理 理查德机场警察 理查德维修 史蒂文安全 史蒂文酒店 史蒂文登记 史蒂文机场助理 史蒂文机场警察 史蒂文维修


为目前为止的帮助干杯。

尝试1应该有效。但是,我会将其更改为更显式的联接,就像您在尝试2中尝试的那样。联接子句不在where中,而是在ON中

正如你所说的,你是新来的,这可能对你有好处


另外,在谷歌上搜索SQLJoin可以获得大量关于这个主题的知识:

尝试1应该可以。但是,我会将其更改为更显式的联接,就像您在尝试2中尝试的那样。联接子句不在where中,而是在ON中

正如你所说的,你是新来的,这可能对你有好处

另外,在谷歌上搜索SQLJoin也可以获得大量关于这个主题的知识:

我建议试试

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; 
我建议试试

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; 
第二次尝试很接近

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

如果这不起作用,您能提供您作为输出得到的信息吗?

尝试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 JOIN Department
ON Department.DeptNo = Staff.DeptNo;

这应该得到正确答案

首先检查您的外键-您在上一次查询中得到了笛卡尔积。 请尝试以下查询:

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

这应该得到正确的答案

谢谢您迄今为止的帮助。当我运行答案中提到的查询时,我更新了问题的答案。我仍然不明白为什么我会得到这个输出。谢谢这里的链接。谢谢到目前为止的帮助。当我运行答案中提到的查询时,我更新了问题的答案。我仍然不明白为什么我会得到这个输出。谢谢这里的链接。我从staff表中的DeptNo中删除了外键。上面用查询的输出进行了更新。我从staff表中的DeptNo中删除了外键。上面更新了查询的输出。欢迎回答。更新了上述问题
h我得到的输出。欢迎回答。用我得到的输出更新了上面的问题。我已经通过创建表、将数据加载到表中并执行上述查询来验证了这一点。两者都将产生您正在寻找的输出。我已经通过创建表、将数据加载到表中并执行上述查询来验证这一点。两者都将产生您正在寻找的输出。为什么要删除外键?这无论如何都不会改变您的查询,因为它更像是一个数据完整性约束。如果您正在执行一个连接,就像我在回答中给出的以及其他人给出的一样,那么您不应该得到您现在的输出。看起来您正在运行完整的外部联接:从Staff、Department、Department中选择Staff.Name、Department.DeptName看起来您的查询是正确的,并以某种方式对其进行了更改…这就是您删除FK的意思吗?请至少发布您当前的查询为什么要删除外键?这无论如何都不会改变您的查询,因为它更像是一个数据完整性约束。如果您正在执行一个连接,就像我在回答中给出的以及其他人给出的一样,那么您不应该得到您现在的输出。看起来您正在运行完整的外部联接:从Staff、Department、Department中选择Staff.Name、Department.DeptName看起来您的查询是正确的,并以某种方式对其进行了更改…这就是您删除FK的意思吗?请至少发布您当前的查询