假设您有一组这样的表:
博物馆(M_NAME,州)艺术家(a_name,国家)艺术品(id,title,m_name*,a_name*)
我想在加利福尼亚州获得所有没有Da-vinci艺术品的博物馆的名字。
关于如何做的任何解释都会对我有很大帮助!
我到目前为止所做的是:
选择m_name 来自博物馆,艺术品 where artwork.m_name*=博物馆.m_name 状态="加利福尼亚"
,但后来我被困在排除包含特定作者艺术品的博物馆。上一行之后,有些人建议这样的事情:
和a_name不存在(选择a_name 来自艺术品 其中a_name =" da-vinci")
我确实了解该命令的存在是什么返回0/1,并取决于子要求结果,但我无法想象为什么在这种情况下它会起作用...
尝试此方法,它使用不存在:
SELECT DISTINCT m.name, m.town
FROM Museum m
WHERE State = 'California'
AND NOT EXISTS (SELECT * FROM Artwork aw WHERE m.M_name = aw.M__name AND A_name = 'Da-vinci')
da vinci
没有艺术品SELECT M_name
FROM Artwork
WHERE LOWER(A_Name) NOT IN ('da vinci')
您没有说如何找出博物馆的位置。(现在我看到你的示例)
加入博物馆桌子以获取"城镇"
SELECT M_name
FROM Museum
JOIN (
SELECT M_name
FROM Artwork
WHERE LOWER(A_Name) NOT IN ('da vinci')
) AS X ON X.M_name = M_name
WHERE Town='Calafornia'
上面的代码应与不存在()代码相同。实际上,如果您对他们俩进行解释,则应该看起来相同。
您可以使用join,而不是在
中select distinct m.name, m.town
from Artwork aw
inner join Museum m on m.M_name = aw.M__name
where aw.A_Name not in ( 'da-vinci');
或使用!=
select distinct m.name, m.town
from Artwork aw
inner join Museum m on m.M_name = aw.M__name
where aw.A_Name != 'da-vinci';
这不存在
select distinct m.name, m.town
from Artwork aw
inner join Museum m on m.M_name = aw.M__name
WHERE NOT EXISTS
(
SELECT null
FROM Artwork aw
WHERE aw.A_Name = ( 'da-vinci');
)
实际上,您已经在问题中写了查询:
- 我想获得博物馆的所有名称
- 在加利福尼亚
- 没有艺术品
- 由da-vinci制作
SELECT m.m_name -- I would like to get all the names
FROM museum m -- of museums
WHERE m.state = 'Californa' -- in California
AND NOT EXISTS ( -- that has no
SELECT * FROM artwork aw -- artwork
WHERE aw.m_name = m.m_name -- For THIS museum
AND aw.a_name = 'Da-vinci' -- made by da-vinci
);