SQL 脚本,我的脚本准确吗?
Posted
技术标签:
【中文标题】SQL 脚本,我的脚本准确吗?【英文标题】:SQL script, are my scripts accurate? 【发布时间】:2013-11-21 19:12:50 【问题描述】:好的,所以我收到了我上周参加的评分考试,即使用 Oracle Plus 的 SQL。我回答的两个问题被标记为错误的,但我强烈认为我是对的,但他坚持认为我的答案是错误的......所以我希望这里有人能澄清我的答案是否正确!
1.) 第一个问题说: "显示 2003 年 5 月未接受治疗的狗的 id 和名称"
所以使用以前创建的数据库,一个被称为“狗”,另一个被命名为“治疗”。
注意 两个表都填充了值 Dog 表由狗 id、name 等值组成,处理表由treatment_id、外键(dog_id)从表 dog 中引用 dog_id 组成, treatment_date 和其他一些字段...
所以我的回答是:
SELECT dog.dog_id, dog.name, treatment.treatment_date
FROM dog, treatment
WHERE treatment.treatment_date NOT BETWEEN '01-MAY-03' and '31-MAY-03'
AND dog.dog_id = treatment.dog_id;
但他说错了…… "--不,这些不在 5 月处理"
2.) 我的第二个问题是 “找出所有曾经收养过收养费最低的狗的医生。注意,收养费最低的狗可能不止一只。列出医生的id和狗的id。按医生id升序排列结果按狗 id 升序排列和为每个医生。”
所以使用我们在考试前创建的其他表,其中一个名为 'adoption' 的表具有 'vet_id' 的属性,它是一个外键,它从名为 vet 的表中引用 vet_id , 和 'dog_id' 另一个外键;并且还使用另一个名为 'treatment' 的表,其属性为 'vet_id' strong> 和 'treatment_fee'
*注意 - 'treatment_fee'本次考试的最低值或费用是 '15'。
我的回答是:
SELECT treatment.vet_id, adoption.dog_id
FROM adoption, treatment
WHERE adoption.dog_id = treatment.dog_id
AND treatment.fee = '15'
ORDER BY treatment.vet_id;
但他又说这是错误的......
所以,我希望这里有人可以帮助我并帮助我解决这种情况。
【问题讨论】:
【参考方案1】:第一个答案:
SELECT dog.dog_id, dog.name
FROM dog
WHERE NOT EXISTS ( SELECT treatment.id
FROM treatment
WHERE tratment.dog_id = dog.id
AND treatment.treatment_date BETWEEN '01-MAY-03' and '31-MAY-03'
)
第二个:
SELECT distinct treatment.vet_id, treatment.dog_id
FROM adoption, treatment
WHERE adoption.dog_id = treatment.dog_id
AND dog.adoption_fee = (SELECT MIN(d2.adoption_fee)
FROM dog d2 )
ORDER BY treatment.vet_id, treatment.dog_id;
【讨论】:
【参考方案2】:对于问题 #1:
您当前的 JOIN 机制不会列出没有接受治疗的狗,因为dog.dog_id = treatment.dog_id
条件不会列出没有接受治疗的狗。
您需要做的是专门找到当月接受治疗的狗,并将它们从整个狗群中删除。您可能需要考虑这样的子选择:
SELECT dog_id
FROM dog
WHERE dog_id NOT IN (SELECT dog_id FROM treatment WHERE treatment_date BETWEEN '01-MAY-03' and '31-MAY-03')
对于问题 #2:
首先,我会记下来,因为当您应该从表格数据中动态找到最低费用时,您硬编码了最低费用。我也想知道你是不是把收养费和治疗费混在一起了。在下面的回答中,我假设收养表中有收养费。你也没有费心去实现第二个排序条件。
您需要确定最低收养费,然后确定具有该收养费的一组狗 id,然后将其与对这些狗 id 进行治疗的兽医 id 结合起来
SELECT t.vet_id, a.dog_id
FROM treatment AS t
INNER JOIN
(SELECT dog_id FROM adoption
WHERE adoption_fee IN (SELECT MIN(adoption_fee) FROM adoption)) AS a
ORDER BY t.vet_id ASC, a.dog_id ASC
归根结底,您的答案被标记为错误是正确的。
【讨论】:
对于第二个问题,我在答案上方写了一个找到最低价格的查询,我忘了在我的问题中包含这个。 @user3018918 是否要求您在单个查询中执行此操作?他有没有注意到你应该使用收养费而不是治疗费?他有没有注意到你没有应用二级排序?【参考方案3】:问题 #1 - 您的查询返回“所有接受过治疗但未在 5 月接受治疗的狗”,而不是“所有接受过治疗但未在 5 月接受治疗的狗”。请注意,如果某只狗在 4 月和 5 月都接受了治疗,那么该狗就会出现在您的查询中。
问题 #2 - 问题是关于“收养费”,但您正在查看最低的“治疗费”。
【讨论】:
你说的太对了,哈哈,我才意识到这个错误,我的意思是把收养费而不是治疗费!哇,我确实配得上这个成绩以上是关于SQL 脚本,我的脚本准确吗?的主要内容,如果未能解决你的问题,请参考以下文章