【发布时间】:2012-02-28 01:53:40
【问题描述】:
我一直在为星期四的考试做一些 SQL,我怀疑我是否正确使用了 EXISTS 语句。
所以,这里我有一个有 2 个表的数据库
Machines Maintenance
============ ==============
PK ID_Machine PK ID_Machine FK
Name PK ID_Task FK
Date_bought Date
所以,他们希望我写的查询是 “显示 2011 年未接受任何维护的最旧机器的所有数据”
我的做法是这样的:
SELECT M.ID_MACHINE, M.NAME, M.DATE_BOUGHT
FROM MACHINES M
WHERE NOT EXISTS (SELECT MA.*
FROM MAINTENANCE MA
WHERE MA.ID_MACHINE = M.ID_MACHINE
AND YEAR(MA.DATE) = 2011)
AND EXISTS (SELECT MIN(M2.DATE_BOUGHT)
FROM MACHINE M2
WHERE M2.ID_MACHINE = M.ID_MACHINE)
这是执行此查询的正确方法吗?我在 EXISTS 语句中使用 SELECT MIN() 有意义吗?
提前感谢大家!
【问题讨论】:
-
嗯....当您尝试运行查询时会发生什么?
-
嗯,问题是我实际上没有在任何 DBMS 中创建这个数据库。这只是教科书中的一个练习,我正在一张纸上解决它。不幸的是,教科书没有答案,所以这就是我问的原因:)
-
首先,您需要一个
AND而不是第二个WHERE。另外,永远不要在EXISTS中使用SELECT MIN()- 这没有任何意义。 -
@Bohemian 是的,你完全正确,我错过了那里的 AND。另外,这基本上是我的疑问。我认为通过将“SELECT MIN()”放在 EXISTS 语句中,它会删除所有其他行,但具有 MIN(Date_Bought) 的行除外。我想我当时错了!
-
你在
exists中使用的第三张表machine m2是什么?