我有两张桌子,
table1
select * from table1,
word
ilo
word1
go
Table2,
select * from table2
ID column1 column2 column3
1 pilot pandas sql
2 USA UK India
3 SQL python word1word2word3
4 came gone went
我希望从table1中获取单词并在table2中的行中过滤掉这些单词,只要这些单词出现在column1,column2和column3中的三列中的任何一列中。我的输出应该是,
ID column1 column2 column3
2 USA UK India
因为,pilot,word1word2word3和gone包含来自第一个表的单词。
我尝试了以下内容,
select ID, column1, column2, column3, case when instr(column1, word) > 0 then 1 else 0 end as ignore from table2 full outer join table1 on 1=1 where ignore = 0
我只为一列写了逻辑。
这似乎有效。但是因为我在这里给1 = 1,所有条目都重复了。我得到以下输出,
ID column1 column2 column3 ignore
2 USA UK India 0
2 USA UK India 0
有人可以帮我解决这个问题吗?
由于
答案 0 :(得分:0)
当你说any of the three columns
时,你可以连续三列。
如果是SQL Server,请使用此代码
首先加入两个这样的表:
SELECT ID FROM table2
INNER JOIN table1 ON CHARINDEX(table1.word, (column1 + column2 + column3)) > 0
这将显示table2中存在的行,然后您可以使用此代码过滤掉。
SELECT * FROM table2 WHERE ID NOT IN
( SELECT ID FROM table2
INNER JOIN table1 ON CHARINDEX(table1.word, (column1 + column2 + column3)) > 0 )
如果不是SQL Server,请将CharIndex
替换为instr
或任何其他查找功能。
答案 1 :(得分:0)
Hive支持exists
和not exists
的相关子查询:
select t2.*
from table2 t2
where not exists (select 1
from table1 t1
where t2.col1 like '%' || t1.word || '%' or
t2.col2 like '%' || t1.word || '%' or
t2.col3 like '%' || t1.word || '%'
);
说实话,我并不是100%确定Hive支持相关的非相等条件。如果是这样,您可能会因为一个简单的解决方案而运气不好。你能做的最好的事情是:
select t2.*
from table2 t2
where not exists (select 1
from table1 t1
where t2.col1 = t1.word
) and
not exists (select 1
from table1 t1
where t2.col2 = t1.word
) and
not exists (select 1
from table1 t1
where t2.col3 = t1.word
);
答案 2 :(得分:0)
尝试以下查询..
SELECT * FROM table2 t2
WHERE NOT EXISTS
( SELECT ID FROM table2
INNER JOIN table1 t1
ON Instr( (t2.column1 + t2.column2 + t2.column3),t1.word) > 0
WHERE t2.ID=tt2.ID)