在where子句中有两个列表匹配的select方法吗?

jjjwad0x  于 2021-06-24  发布在  Hive
关注(0)|答案(2)|浏览(276)

我需要做一个select,但是我需要匹配where子句中的两个列表来过滤我的结果。比如:

SELECT * FROM TAB1
WHERE FieldPartition = W
AND Field1 IN (X1,X2...X600)
AND Field2 IN (Y1,Y1...Y600);

但是select仅在x1匹配y1、x2、y2等时返回。
我在where子句中加了一堆括号中的or-between-and,这很管用,但我需要另一种方法。

SELECT * FROM TAB1
WHERE FieldPartition = W
AND (Field1 = X1 AND Field2 = Y2) OR
    (Field1 = X2 AND Field2 = Y2) OR
    (Field1 = X600 AND Field2 = Y600);

上面的代码按预期工作,但需要很长时间才能运行,因为表很大,我希望有更快的东西。
有什么想法吗?
谢谢

ztyzrc3y

ztyzrc3y1#

简言之,在配置单元中使用一个简单的查询是不可能的,因为在配置单元中只能有一列 IN 子句,而您需要将表中的两列与值对匹配。请参阅此处的类似讨论。
要实现目标,最简单的(但可能是效率最低的)方法是在一个集合上匹配一个集合,例如。

SELECT * FROM TAB1
WHERE FieldPartition = W
AND CONCAT(Field1,',',Field2) IN ('X1,Y1','X2,Y2'...'X600,Y600');

然而,这将运行 CONCAT 每行 TAB1 ,这可能不是你想要的。
如果您想要更结构化的东西,您可能需要创建一个表,例如。 FILTER_TAB ,带列 X 以及 Y ,在此处加载所有筛选器值,然后使用 JOIN ,例如。

SELECT t1.* 
FROM FILTER_TAB f
JOIN TAB1 t1
ON (f.X=t1.Field1 AND f.Y=t1.Field2)
WHERE t1.FieldPartition = W;

你可能想做 LEFT JOIN 或者 LEFT OUTER JOIN 那就看你的要求了。

9avjhtql

9avjhtql2#

你试过:

SELECT * FROM TAB1
     WHERE FieldPartition = W
     AND Field1 IN (X1,X2...X600)
     AND Field1 = Field2;

自从我意识到 Field2 IN (...) 是多余的。

相关问题