我有一個每行一個單詞的表格和一個連續有一些文本的表格。我只需要從第二個表中選擇那些不包含第一個表中單詞的行。
例如:
帶有約束詞的表
| 約束字 |
|---|
| 例子 |
| 蘋果 |
| 橘子 |
| 蘑菇 |
| 車 |
| qwerty |
帶文字的表格
| 文本 |
|---|
| 詞 1。蘋果;word3,例子 |
| word1,蘋果,word2。車 |
| word1 word2橙色word3 |
| 蘑菇word1 word2 word3 |
| word1車 |
| qwerty |
在這種情況下不應選擇任何內容,因為第二個表中的每一行都包含第一個表中的單詞。
我只有一個想法CROSS JOIN來實作這一目標
SELECT DISTINCT text FROM text_table CROSS JOIN words_table
WHERE CONTAINS(text, constraint_word ) = 0
有沒有辦法在不使用的情況下做到這一點CROSS JOIN?
uj5u.com熱心網友回復:
contains指 Oracle 文本;交叉連接意味著笛卡爾積(通常是性能噩夢)。
避免這兩種情況的一個選項是instr函式(檢查 in 的存在constraint_word,text但這次使用內部連接)和minus集合運算子。
像這樣,使用您發布的示例資料:
SQL> select * from text_table;
TEXT
---------------------------
word1.apple; word3, example
word1, apple, word2.car
word1 word2 orange word3
mushroomword1 word2 word3
word1 car
qwerty
6 rows selected.
SQL> select * From words_table;
CONSTRAI
--------
example
apple
orange
mushroom
car
qwerty
6 rows selected.
SQL>
正如您所說,最初查詢不應回傳任何內容,因為所有內容都constraint_words存在于text:
SQL> select c.text
2 from text_table c
3 minus
4 select b.text
5 from words_table a join text_table b on instr(b.text, a.constraint_word) > 0;
no rows selected
讓我們修改其中text一行:
SQL> update text_table set text = 'xxx' where text = 'qwerty';
1 row updated.
現在結果如何?
SQL> select c.text
2 from text_table c
3 minus
4 select b.text
5 from words_table a join text_table b on instr(b.text, a.constraint_word) > 0;
TEXT
---------------------------
xxx
SQL>
對; 我們剛剛修改的文本。
uj5u.com熱心網友回復:
您的想法很好,因為您需要測驗每個文本的所有單詞。這就是 CROSS JOIN 所做的 - 組合(笛卡爾積)。
我們甚至可以更嚴格地獲得更好的性能并使用 INNER JOIN 或簡寫JOIN。
另請參閱:SQL 中的 CROSS JOIN 與 INNER JOIN
此外,您需要過濾所有text沒有匹配項的記錄。這意味著每個組合中不匹配的計數text是最大值(= 約束字數,此處為 6)。這個過濾器可以使用GROUP BYWITHHAVING
-- text without any constaint_word
SELECT t.text, count(*)
FROM text_table t
JOIN words_table w ON CONTAINS(t.text, w.constraint_word, 1) = 0
GROUP BY t.text
HAVING count(*) = (SELECT count(*) FROM words_table)
;
它將輸出:
| 文本 | 數數(*) |
|---|---|
| 蘑菇word1 word2 word3 | 6 |
在SQL Fiddle上嘗試演示
整個單詞與部分匹配
請注意,約束詞中的“蘑菇”不匹配,CONTAINS因為它包含為詞部分而不是整個詞。
對于部分匹配,您可以使用LittlefootINSTR的回答。
也可以看看
- 在 oracle SQL 查詢中使用字串包含函式
- PL-SQL 中的 contains() 是如何作業的?
- Oracle 背景關系索引
- 創建和維護 Oracle 文本索引
uj5u.com熱心網友回復:
我相信這行得通(我認為CROSS JOIN路線的問題在于它包含任何不包含至少一個單詞的文本——不僅僅是不包含任何單詞的文本):
SELECT DISTINCT text FROM text_table WHERE (SELECT COUNT(*) FROM words_table WHERE CONTAINS(text, constraint_word)) = 0;
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/414319.html
標籤:
