【发布时间】:2021-11-04 20:18:34
【问题描述】:
我有两张桌子A 和B。表A有两列cust_id和address,数据类似
'12345678', '457 Edinburgh Ln Heber City UT 84032-1442'
表 B 只有一列,highvalue_blocks,它存储了大量的名称。名称是表 A address 列的部分。
例如,highvalue_blocks 之一可能是 'Ln Heber City'。
'Ln Heber City' 是'457 Edinburgh Ln Heber City UT 84032-1442' 的一部分。它应该被批准。
问题:如何编写SQL语句查询address以检查high values blocks是否在其中?
我尝试使用这个 SQL:
SELECT A.CUST_ID
FROM A
WHERE A.ADDRESS LIKE (SELECT '%'||B.HIGHVALUE_BLOCKS||'%' FROM B)
它有效。但我认为它可以更有效地解决,因为它需要很长时间才能完成。
请帮忙。非常感谢。
【问题讨论】:
-
这种基于 LIKE 的 join 会导致交叉 join(Explain 中的 product join),当然会消耗大量资源。两个表的行数是多少?
-
@dnoeth 。 . .查询真的有效吗?我希望它返回子查询返回多行的错误。
-
@GordonLinoff:它会按原样失败,但我假设在实际查询中添加了缺少的关键字 ANY,否则 OP 不会抱怨 完成时间很长 :-) LIKE 可以引用 Teradata 中的模式列表,并且该列表可以由子查询提供,例如
col LIKE ANY ('...', '...')用于 ORed 和LIKE ALL用于 AND 条件。