【问题标题】:SQL inner join incorrect resultsSQL 内连接不正确的结果
【发布时间】:2019-11-22 10:46:02
【问题描述】:

我的问题如下:

我正在尝试使用 WordNet MySQL,尝试添加除了已经存在的视图之外的另一个视图,例如:

CREATE OR REPLACE VIEW synsetsXsemlinksXsynsets AS 
SELECT 
       linkid,s.synsetid AS ssynsetid
       ,s.definition AS sdefinition
       ,d.synsetid AS dsynsetid
       ,d.definition AS ddefinition 
FROM synsets AS s 
     INNER JOIN 
     semlinks AS l ON s.synsetid = l.synset1id 
     INNER JOIN 
     synsets AS d ON l.synset2id = d.synsetid;

因此,以该代码作为参考,我尝试执行以下操作:

CREATE VIEW graph AS  
SELECT 
       l.linkid
       ,s.synsetid AS sssinsetid
       ,w.lemma AS swlemma
       ,s.definition AS sdefinition
       ,d.synsetid AS dsynsetid
       ,w.lemma AS dwlemma
       ,d.definition AS ddefinition 
FROM synsets AS s 
     INNER JOIN  
     semlinks AS l ON s.synsetid = l.synset1id 
     INNER JOIN  
     synsets AS d ON l.synset2id = d.synsetid 
     INNER JOIN  
     lexlinks AS x ON l.synset1id = x.synset1id 
                      AND l.synset2id = x.synset2id 
     INNER JOIN  
     words AS w ON w.wordid = x.word1id 
                      AND x.word2id = w.wordid

为了得到:linkid | ssynsetid | swlemma | sdefition| dsynsetid | dwlemma | ddefition

但它没有按预期工作。虽然第一个给了我 285639 行,但我只给了我 12 行。我不确定问题出在哪里。有什么帮助吗?

编辑:

我预期会发生的是,该语句将返回 sslemma 中的单词和 dwlemma 中的引理。所以我想我会得到使用的词和它们的引理形式。谢谢。

【问题讨论】:

  • 为什么它们应该是相同的,您在第二个查询中有 2 个额外的联接?
  • 这是该输入的输出,因为这就是 SQL 的工作方式。你还期待什么其他答案? SQL 及其子表达式的工作方式无论如何都是重复的问题,并且可以通过任何(权威)SQL 介绍轻松回答。如果您想知道为什么您的(错误)期望没有得到满足,那么您必须告诉我们您的期望。它们是什么,足以让我们告诉你它们哪里错了?第一个没有返回预期结果的子表达式是什么?
  • 请在代码问题中给出minimal reproducible example--剪切&粘贴&运行代码;具有期望和实际输出(包括逐字错误消息)的示例输入(作为初始化代码);标签和版本;明确的规范和解释。对于包含最少代码的错误,您可以给出的代码是您显示的代码可以通过您显示的代码扩展为不正常。 (调试基础。)对于包含 DBMS 和 DDL 的 SQL,其中包括约束、索引和表格初始化。
  • @P.Salmon 不,我没想到会完全一样,但我希望得到超过 12 个条目,我认为这 12 个条目是引理和单词相等的条目.所以我需要改变咨询。 philipxy 我将尝试澄清这一点。谢谢。
  • 您的编辑没有帮助。你不清楚。没有人可以接受您写的内容并知道您的查询应该做什么或为什么您认为它会这样做。 (当然,我们可以猜测。)使用足够多的单词、句子和对部分示例的引用来清楚完整地表达你的意思。在给出业务关系(船舶)/关联或表(基础或查询结果)时,说明其中的一行根据其列值说明了业务情况。 PS请不要插入编辑/更新,只是让你的帖子成为目前最好的演示文稿。添加不清楚的内容并不能说明清楚。

标签: mysql sql inner-join wordnet


【解决方案1】:

对 2 个额外的表使用 LEFT JOIN。

 ...
 FROM synsets AS s 
 INNER JOIN  
 semlinks AS l ON s.synsetid = l.synset1id 
 INNER JOIN  
 synsets AS d ON l.synset2id = d.synsetid 
 LEFT JOIN  
 lexlinks AS x ON l.synset1id = x.synset1id 
                  AND l.synset2id = x.synset2id 
 LEFT JOIN  
 words AS w ON w.wordid = x.word1id 
                  AND x.word2id = w.wordid

因为如果使用 INNER JOIN,那么它会过滤那些不匹配的。

【讨论】:

  • 谢谢。这似乎有效。但是我现在的问题是,在我期望使用单词及其引理之类的东西的地方得到了空值。但你的答案有效,我可能不得不更改代码
  • 好吧,只有您可以看到您正在处理的数据。 :) 仅使用 SQL 作为信息很难猜测。也许那些联接中的那些 AND 应该是 OR? F.e. ON (l.synset1id = x.synset1id OR l.synset2id = x.synset2id)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-23
  • 1970-01-01
  • 1970-01-01
  • 2015-11-19
  • 1970-01-01
相关资源
最近更新 更多