【问题标题】:Best way to detect if a column value is included in another table's column in SQL Server检测列值是否包含在 SQL Server 中另一个表的列中的最佳方法
【发布时间】: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


【解决方案1】:

没有有效的方法来做到这一点。您必须对字符串进行痛苦的逐行比较,那就是:

SELECT x.*
FROM TableX x
WHERE EXISTS (SELECT 1
              FROM TableY
              WHERE ', ' + y.field2 + ', ' LIKE '%, ' + x.Field1) + ', %'
                    y.FieldStatus = 'Active'
             )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-13
    • 1970-01-01
    • 1970-01-01
    • 2017-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多