【问题标题】:In SQL Server, how to filter lots of elements across multiple columns在 SQL Server 中,如何过滤多个列中的大量元素
【发布时间】:2014-04-29 15:03:49
【问题描述】:

我有一个表t1,其中包含namecode1code2、...、code20等列

比如说,有 100K 行。

我有另一个查找表t2,其中有一列code;它有 10k 行,每行都有一个代码。所以,这个 1 列表中总共有 10K 个代码。

我需要从任何列中过滤掉t1 中具有t2 代码的所有行,即列code1code20。换句话说,在t1 的每一行中,一旦一列有t2 中的代码之一,就应该捕获它。

有没有简单的方法来做到这一点?非常感谢!

【问题讨论】:

  • 这是一个非常时髦的数据库设计。您是否可以稍微更改架构?
  • 如果您有适当的数据库设计,将是一种简单的方法 - 例如如果您已通过 1:n 关系将 t1 链接到代码列表(而不是 Code1...Code20 在您的 t1 表中)。为什么这个搞砸了设计,没有简单的方法.....

标签: sql sql-server filter


【解决方案1】:

这是一种使用not exists的方法:

select t1.*
from t1
where not exists (select 1
                  from t2
                  where t2.code = t1.code1 or
                        t2.code = t1.code2 or
                        . . .
                        t2.code = t1.code20
                 );

在嵌套选择中使用in 作为条件是很有诱惑力的,但这与NULLs 的行为方式很奇怪。直接比较的顺序更容易。

也就是说,具有相同类型数据的 20 列通常表示表格设计不佳。更典型的情况是,数据将位于某种关联/联结表中,20 列分别出现在各自的行中。

【讨论】:

    【解决方案2】:

    听起来您需要对表 t1 中的数据进行透视,然后在 t2 上加入。 因此,您可以将 t1 转为 只需名称和代码列,然后加入 t2。 或者,您可以在 t2 上为 t2 的每个列 Code 1 到 20 执行单独的 t1 连接,然后合并结果。 如果我正确理解了你的问题。

    【讨论】:

    • Gordon 的回答比我的加入解决方案要好,但我认为他在寻找匹配项。小点:上面的代码应该没有“存在”而不是“不存在”吗?我以为他想“捕捉”比赛
    猜你喜欢
    • 2017-10-26
    • 2021-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    • 1970-01-01
    • 2015-11-09
    相关资源
    最近更新 更多