【问题标题】:MySQL Retrieve Records Where Criteria is Unique and True i.e. No other records existMySQL检索条件唯一且为真的记录,即不存在其他记录
【发布时间】:2011-07-05 21:05:48
【问题描述】:

我有一个遗留数据库,我正在使用这样的基本列布局:

SampleID
CompanyID
CompanyApplication
CompanyTest1
...
CompanyTest25

至少没有标准化,这会导致一些数据挖掘问题。

我需要获取 CompanyID(分组依据),其中 CompanyApplication 字段 = “Registration”,但该公司没有为任何 SampleID 选择 CompanyTest(n) 字段。

问题是,有些 CompanyID 同时具有 CompanyApplication 和 CompanyTest(n) 记录(多行),但我想获取仅具有 CompanyApplication 注册的 CompanyID。

数据帮助说明:

SampleID | CompanyID | CompanyApplication | CompanyTest1 | ... | CompanyTest25
------------------------------------------------------------------------
1         | 1        | Registration       |              |     |
------------------------------------------------------------------------
2         | 1        |                    | True         |     |
------------------------------------------------------------------------
3         | 2        | Registration       |              |     |
------------------------------------------------------------------------
4         | 2        | Registration       |              |     |
------------------------------------------------------------------------
5         | 3        |                    | True         |     |
------------------------------------------------------------------------
6         | 3        |                    |              |     | True

我只想检索第 3 行和第 4 行,因为它们只有注册,没有其他测试。

【问题讨论】:

    标签: mysql subquery criteria unique


    【解决方案1】:

    我们可以首先选择您尝试排除的所有行,然后使用NOT EXISTS 跳过该查询中的CompanyIDs。

    SELECT DISTINCT ct1.company_id
    FROM company_table AS ct1
    WHERE ct1.CompanyApplication = "Registration"
      AND NOT EXISTS(
            SELECT 1
            FROM company_table AS ct2
            WHERE ct1.company_id = ct2.compnay_id
              AND (ct2.CompanyTest1 IS NOT NULL
                   OR ct2.CompanyTest2 IS NOT NULL
                   ...
                   OR ct2.CompanyTest25 IS NOT NULL)
            )
    

    【讨论】:

    • 我想我忘了提到我不想做 ct2.CompanyTest1 IS NOT NULL OR ct2.CompanyTest2 IS NOT NULL ... OR ct2.CompanyTest25 IS NOT NULL 因为那很多打字,我想知道是否有更巧妙的方法。
    • 可能不远了;作为一项规则,sql 将不同的列视为完全不同的数据,这些数据不能简单地以一种可以让您将它们用作集合的方式进行组合。如果它们应该是一个集合,那么它们属于同一列;这是保留遗留模式的缺点,而不是将其迁移到更接近其实际含义的表示。
    • 相信我,我想修复此架构,但现在需要提取数据并重写此架构(以及此数据库中涉及的 64 个其他表)需要花费大量时间。谢谢你的代码。我总是忘记存在
    猜你喜欢
    • 1970-01-01
    • 2019-06-13
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 2013-11-23
    • 1970-01-01
    • 2015-01-26
    • 1970-01-01
    相关资源
    最近更新 更多