sqlite子查询传递奇怪的结果

时间:2017-08-27 22:29:28

标签: sqlite

我得到了以下查询的意外输出。:

SELECT *
FROM Ethymologie
WHERE VerbundenesWort IN
    (SELECT DISTINCT VerbundenesWort FROM 
        (SELECT DISTINCT VerbundenesWort FROM Ethymologie WHERE VerbundenesWort IS         NOT NULL) 
     ORDER BY RANDOM() LIMIT 1)

我想从一个表('Ethymologie')中选择一个值(在这里无关紧要;使用random()进行演示)。
然后我想列出同一个表中具有相同值的所有行。 每个子查询都像魅力一样。

当我使用整个SQL查询时,有问题的结果才会变得可见。 这是奇怪结果的截图。

enter image description here

谁能告诉我我做错了什么?

THX!

1 个答案:

答案 0 :(得分:0)

我猜猜联合词= 1的条目是你觉得奇怪的 这是因为(我必须再次猜测,因为缺少MCVE,提示提示或至少是架构,暗示提示) 你的架构有"关节词"作为文本,当您将似乎是索引的内容存储到另一个表中时(在该细节中没有设计问题)。

因此IN运营商会找到' 1'在里面' 10'。

因此,您的问题的实际解决方案是将列更改为某种整数(可能是外键)。

但万一你不能或不想,
这是一些解决当前架构的代码。

SELECT * 
FROM Ethymologie 
WHERE VerbundenesWort = 
    (select *
     from 
         (SELECT DISTINCT VerbundenesWort 
         FROM Ethymologie 
         WHERE VerbundenesWort IS NOT NULL
         )
     order by random() limit 1
    );

请注意,如果存储实际的联合词而不是索引/整数,则可能会遇到同样的问题。这是因为特殊的文本,由联合词组成。寻找Donaudampfschiff'在Donaudampfschiffahrtsgesellschaft'也会引起问题。

如果您希望能够使用几个随机选择的单词之一(例如LIMIT 2)创建行列表,那么您必须坚持使用IN,但将模式更改为int / key,或者(丑陋的解决方法)使用单词边界分隔符进行比较,这当然不是构建在SQLite中的,但是有点神奇可以做到这一点。但是你不希望那种用于制作鱼腥模式的解决方法的魔法,不是吗? ; - )