2017-05-06 47 views
1

我想在SQL中做一些练习,但我有一个很大的问题来了解一些查询。SQL不存在子查询

以下是我与工作表:

  • Spectacle(Spectacle_ID,滴度DateDéb,绵延,Salle_ID,Chanteur)
  • Concert(Concert_ID,日期,HEURE,Spectacle_ID)
  • Salle (Salle_ID,喃,住址,Capacité)
  • Billet(Billet_ID,Concert_ID,Num_Place,Catégorie,披)
  • Vente(Vente_ID,Date_Vente,Billet_ID,MoyenPaiement)

的问题是选择所有chanteur他们在所有salles至少有一场音乐会。

的解决方案是

SELECT Chanteur 
FROM Spectacle t 
WHERE NOT EXISTS (SELECT * 
        FROM Salle u 
        WHERE NOT EXISTS (SELECT * 
            FROM Spectacle v 
            WHERE v.Chanteur = t. Chanteur 
             AND u.Salle_ID = v.Salle_ID) 
       ) 

,但我无法理解这个概念。

请教程或解释一些帮助 - 感谢

+0

双重否定。除了那些场地不存在但没有在那里的所有表演中表演的人以外,所有人都可以获得。我想如果你用口头语言和逻辑来理解,你也可以使用SQL。这不是一个语法问题,更多的是让你头脑发热的问题。 – dlatikay

回答

1

我可以看到为什么解决方案可能会造成混乱。返回需要其他行存在的结果迫使我们垂直而不是水平地将问题可视化。希望这会有所帮助。

我们只想返回Chanteur,在SalleSpectacle

另一种说法是返回Chanteur,它不会丢失任何Salle

您所提出的解决方案以更接近问题的第二种形式解决问题。只有在不存在任何Salle的情况下,它才会返回Chanteur,对于该(不缺少任何Salle),该号码没有相应的Spectacle

另一种解决方案是对每个Chanteur使用聚合和count(distinct Salle_ID),并将其与Salle中的总行数进行比较。这似乎更自然,当问题为已全部而不是不会丢失任何

+1

嗨,谢谢你的回答,这里是我的建议“从chanteur拥有count(独特salle_id)> =(从salle选择count(sale_id)的眼镜组中选择chanteur”)这个答案是否正确? –

+0

@maevabell。 。 。我更直观地查看您的查询。 –

+0

@maevabell看起来正确,也更简单。请注意,您可以使用'='而不是'> =' – SqlZim