我一直试图争抢一个查询以获取3个表的列,但我一直得到不匹配的行。
这些是我的表格:
消息
- messageID
- 发件人(可以是customerID或employeeID)
- 接收者(可以是customerID或employeeID)
(注意:对于每封邮件,它只包含1位客户和1位员工,即客户不会互相交流,员工也不会互相发送信息)
客户
- customerID
员工
- employeeID
- departmentID
DEPARTMENT
- departentID
- departmentName
对于customerID = 5的特定客户,我想知道他们正在与之交谈的员工的DepartmentName是什么。
我在这方面的尝试是:
SELECT * FROM Messages,Employee, Departmnet,
WHERE sender = '5' OR receiver = '5'
AND (Employee.employeeID = Messages.sender OR Employee.employeeID = Messages.Receiver)
AND Employee.departmentID = Department.DepartmentID;
然而,这会返回比预期更多的行。我认为这是因为发件人或收件人可能是employeeID。
我的第二个猜测是也许我必须加入牌桌,但我没有太多经验。如果有人可以告诉我或告诉我如何执行此查询,我将不胜感激。
答案 0 :(得分:2)
根本问题是你在这个条款中缺少括号:
sender = '5' OR receiver = '5'
但是,我建议您使用ANSI样式的连接来使查询更具可读性。
这应该有所帮助:
SELECT *
FROM Messages
INNER JOIN Employee ON (Employee.employeeID = Messages.sender OR Employee.employeeID = Messages.Receiver)
INNER JOIN Department ON Employee.departmentID = Department.DepartmentID
WHERE (Messages.sender = '5' OR Messages.receiver = '5');
答案 1 :(得分:1)
你试过这个:
SELECT * FROM Messages m
INNER JOIN Employee e
INNER JOIN Departmnet d
ON ((m.sender=e.employeeId || m.receiver=e.employeeId) d.departmentId=e.departmentId)
WHERE m.sender = '5' OR m.receiver = '5'
答案 2 :(得分:0)
您的问题实际上是Employee
与[{1}}具有相同的ID,无法区分两者。
我认为更好的方法是将Customer
和Customers
都视为Employees
,并将Users
表格与User
相关联}表,告诉您他们是客户还是员工。
另一种方法是让Message表具有EmployeeID的一个字段和CustomerID的一个字段,以及一个字段,用于指定这是客户到员工还是员工到客户。换句话说,发送的消息或收到的消息。
最后,如果您确定不会与客户和员工ID发生冲突,那么这可能会对您的查询产生影响:
Role
以上规定接收方和发送方不能同时是员工或客户。
更新:为了澄清,单个字段不应引用另外两个表,因为这样就无法将其指定为外键。两个表的标识列中可能存在冲突。例如,如果您的客户ID为5,员工ID为5,会发生什么?
有处理这种情况的技巧,其中一些显示在这里:Foreign Key to multiple tables