2017-08-27 57 views
1

我得到如下: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')。
然後,我想列出具有相同值的同一個表中的所有行。 每個子查詢都像一個魅力。

當我使用整個sql查詢時,問題結果纔會變得可見。 以下是奇怪結果的截圖。

enter image description here

誰能告訴我什麼,我做錯了什麼?

Thx!

+0

請提供一些'create ...'行和'insert ...'行作爲嘗試和演示的基礎。 https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql-query – Yunnosch

+1

請解釋結果如此奇怪。 – Yunnosch

+0

請將您的模式顯示爲MCVE的最小值。 – Yunnosch

回答

0

我猜測,聯合詞= 1的條目是你發現奇怪的。
這是由於(我必須再次猜測,因爲缺少MCVE,提示提示,或至少一個架構,提示提示)
您的架構有「聯合詞」作爲文本,而你是將似乎是索引的東西存儲到不同的表格中(該細節中沒有設計問題)。

因此,IN運算符將在'10'內找到'1'。

因此,您的問題的實際解決方案是將列更改爲某種整數(可能是外鍵)。

但如果你不能或不想,
這裏有一些代碼來解決你當前的模式。

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

需要注意的是你,如果你實際存儲的替代指標/整數聯合的話很可能有同樣的問題。這是由於特殊類型的文本,它由聯合詞組成。在'Donaudampfschiffahrtsgesellschaft'找到'Donaudampfschiff'也會導致問題。

如果你希望能夠使行的列表與幾個隨機選擇的一個詞(如LIMIT 2),那麼你就必須堅持IN但變化模式爲int /鍵,或(醜陋的解決方法)用字用於比較的邊界分隔符,這當然不是內置於SQLite中,但有一點魔法可以做到這一點。但是,你不希望這種魔法被用於製造無論如何是一個魚腥模式的解決方法,你呢? ;-)

+0

不錯的主意,但同樣的問題,但又一次![Valid XHTML](http://imgur.com/a/NLzb2)。 – baer999

+0

這裏是db strcuture圖片:http://imgur.com/a/aytEe – baer999

+0

請提供一個[mcve]的要點是StackOverflow的其他用戶不必a)創造/猜測一個b)不要必須輸入英寸。那麼你能如此高興地將你的兩張照片中的信息編輯成你的問題**文本**嗎?不要忘記包含幾行「插入...」作爲示例數據庫內容。 – Yunnosch