从一个表中获取单词并从其他表中过滤掉包含该单词的行

时间:2016-08-21 07:07:13

标签: sql hive

我有两张桌子,

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

有人可以帮我解决这个问题吗?

由于

3 个答案:

答案 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支持existsnot 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)