【问题标题】:SQL Join query returns null instead of namesSQL Join 查询返回 null 而不是名称
【发布时间】:2021-11-30 14:19:46
【问题描述】:

我正在尝试连接两个表以获取未在复制表中借用的视频标题,并且我认为除了表值返回 null 之外,我已正确完成所有操作?而不是它只是说 null 的实际名称,我是 SQL 新手,我真的不知道我做错了什么。

SELECT 
   video.vidTitle, 
   video.vidCertificationID, 
   copy.copCurrentlyHired 
FROM video 
RIGHT JOIN copy ON video.vidVideoID = copy.copCopyID 
WHERE copCurrentlyHired = 1; 

【问题讨论】:

  • 尽量避免使用 RIGHT JOIN,见:stackoverflow.com/questions/436345/…
  • 在这种情况下,表copy中有记录,而表video中没有匹配记录
  • 切换 rightleftwhereand 然后添加一个新行 WHERE copy.copCopyID is null 虽然.....取决于数据,这可能也不正确。 .. 需要一些样本数据和预期结果来了解/更好地了解您的情况。
  • @xQbert 非常感谢,我在这件事上工作了四个小时
  • 只要确保您取回“正确”的数据。我不肯定这会正确处理您的所有情况,因为这将取决于这些表的使用方式以及何时存储在其中的数据。如果你不明白“为什么”它会起作用,就问问题......整个教一个人钓鱼......而不是给一个人一条鱼。

标签: mysql sql-null


【解决方案1】:
SELECT 
   video.vidTitle, 
   video.vidCertificationID, 
   copy.copCurrentlyHired 
FROM video 
LEFT JOIN copy ON video.vidVideoID = copy.copCopyID 
  and copCurrentlyHired = 1; 
WHERE copy.copCopyID is null.

为什么?

  • LEFT vs RIGHT:我们想要视频中的所有记录,无论如何,从视频到副本的左连接可以做到这一点。
  • 在哪里以及:这确保我们只在加入那些未“当前雇用”的人时获得当前雇用的副本,因此加入只会返回当前雇用的人。
  • WHERE:这确保我们只取回那些我们没有当前雇用记录的记录。但;这可能不是你真正想要的......

我担心的边缘情况: 如果您为同一个 videoID 复制了多条记录,并且当前雇用了一条记录,而另一条则没有。我不确定你想在这种情况下发生什么。

也许你只是在左加入之后,当前雇用的人是 1 w/o a where...

因此,具有预期结果的样本数据有助于我们了解您想要实现的目标。

【讨论】:

    猜你喜欢
    • 2010-11-05
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多