繁体   English   中英

多个where子句,只读一个

[英]Multiple where clauses, reading only one

我必须检索多个where子句的信息。 我只能使用嵌套查询来完成此操作。 我应该能够在一个命令上提取2个shiftName查询的信息。 找到工作人员的名字和姓氏,他们的班次是Classy Evening and Morning Shine。

到目前为止,我发现运气不足的是这个代码,但问题在于它是返回'Morning Shine'的结果而不是'Classy Evening'的结果。 这就像嵌套查询甚至没有被处理。 有人可以请帮助。 我是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');

条件在哪里。

如果要使用其他查询执行条件,则需要提供要比较的列。

您没有给列进行比较,因此它忽略了where条件的第二部分。

在您的情况下,您希望'Morning Shine'和'Classy Evening'的staffID相等。

所以你需要这样做:

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而不是CARTESIAN来改进查询。

所以查询将是:

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');

您可以使用聚合。

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语法。
  • 表别名使查询更易于编写和读取。
  • 限定所有列名称,以便您知道它们来自哪个表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM