多个where子句,只读一个



我必须检索带有多个where子句的信息。我只能使用嵌套查询来做到这一点。我应该能够在一个命令上提取 2 个 shiftName 查询的信息。查找轮班为"优雅的夜晚"和"晨曦"的员工的名字和姓氏。

到目前为止,我发现的一点运气都是这个代码,但这里的问题是它返回的是"晨光"的结果,而不是"优雅的夜晚"的结果。就像嵌套查询甚至没有被处理一样。有人可以帮忙吗?我是SQL的新手,所以如果我的问题不够清楚,我深表歉意。

SELECT stfName, stlNname
FROM STAFF, STAFF_SHIFT_CENTER
WHERE STAFF.staffID=STAFF_SHIFT_CENTER.staffID
AND STAFF_SHIFT_CENTER.shiftName='Morning Shine'
AND (SELECT staffID FROM STAFF_SHIFT_CENTER
WHERE shiftName='Classy Evening');

您可以为此使用聚合。

SELECT s.stfName, s.stlNname
FROM STAFF s JOIN
     STAFF_SHIFT_CENTER ssc
     ON s.staffID = ssc.staffID
WHERE ssc.shiftName IN ('Morning Shine', 'Classy Evening')
GROUP BY s.stfName, s.stlNname
HAVING COUNT(DISTINCT ssc.shfitName) = 2;  -- each group has both shifts

笔记:

  • 切勿FROM子句中使用逗号。
  • 始终使用正确、明确、标准JOIN语法。
  • 表别名使查询更易于编写和读取。
  • 限定所有列名,以便知道它们来自哪个表。

哪里是条件。

当您想对另一个查询执行条件时,您需要提供要比较的列。

您没有提供要比较的列,因此它忽略了 where 条件的第二部分。

在您的情况下,您希望"晨光"和"优雅之夜"的工作人员ID相等。

所以你需要做:

SELECT stfName, stlNname
FROM STAFF, STAFF_SHIFT_CENTER
WHERE STAFF.staffID=STAFF_SHIFT_CENTER.staffID
AND STAFF_SHIFT_CENTER.shiftName='Morning Shine'
AND STAFF_SHIFT_CENTER.staffID IN (SELECT staffID FROM STAFF_SHIFT_CENTER
WHERE shiftName='Classy Evening');

此外,我建议您使用 JOIN 而不是笛卡尔来改进您的查询。

因此,查询将是:

SELECT stfName, stlNname
FROM STAFF s JOIN STAFF_SHIFT_CENTER ssc
     ON s.staffID=ssc.staffID
WHERE ssc.shiftName='Morning Shine'
AND ssc.staffID IN (SELECT staffID FROM STAFF_SHIFT_CENTER
WHERE shiftName='Classy Evening');

最新更新