【发布时间】:2020-03-19 17:50:15
【问题描述】:
我正在尝试寻找最好(更有效)的方法来检测 TableX->Field1 值是否包含在 TableY->Field2 中。 TableY->Field2 是几个 TableX->Field1 值的串联
样本数据:
Table X | Table Y
|
Field1 | Field2 FieldStatus
|
orange | orange, mango Active
pear | pear, orange Active
mango | orange, pear Active
banana | pear, mango Active
预期的结果是:
orange
pear
mango
因为这些是 TableX->Field1 中的值,至少包含在 TableY->Field2 的一个条目中。
我正在尝试使用此代码:
SELECT *
FROM TableX
WHERE ( SELECT TOP 1 FieldStatus
FROM TableY
WHERE CONTAINS (TableY.Field2, TableX.Field1) --Won't work
ORDER BY TableY.Date DESC) = 'Active'
但似乎 T-SQL 函数“CONTAINS”在这种情况下不起作用,我认为“LIKE”会相当昂贵(效率低下?)
有没有更好的方法来做到这一点?
提前谢谢你。
【问题讨论】:
-
“包含”是什么意思?样本数据和期望的结果会有所帮助。
-
“包含”作为 T-SQL 的“包含”函数:WHERE CONTAINS (TableY.Field2, TableX.Field1)
-
一种“更好的方法”是没有包含多个值串联的列。这种列几乎总是表明数据库设计决策不佳。将这样的表格规范化为第一范式几乎总是可行的方法。
-
@HoneyboyWilson 我同意并感谢您的建议,但这不在我的权力范围内。我需要处理我所拥有的
-
如果正确的数据库规范化不是一个选项,首先将列拆分为派生表并加入。 SQL Server (stackoverflow.com/…) 可以使用 UDF 和 CLR-UDF 选项来执行此操作。由于缺乏基本的标准化和索引,问题本身只会随着预先简化(或预先实现)的集合而扩展。
标签: sql sql-server