获取包含一对多的行但不是另一个

mm9b1k5b  于 2021-08-01  发布在  Java
关注(0)|答案(1)|浏览(257)

我在这个问题上有点麻烦。我想筛选我的特性,以查找所有具有名称为“g6”的适用性,但与名称为“n2”的适用性也没有多对多关系的特性。我现在有:

SELECT inner.* 
FROM 
    (SELECT feat.* 
    FROM Features feat
        INNER JOIN Feature _has_Applicability feat_app 
            ON feat_app.feature_id = feat.id
        INNER JOIN Applicability app 
            ON feat_app.applicability_id = app.id 
                AND app.name like '%G6%'
    WHERE feat.deleted_time = '0000-00-00 00:00:00'
    GROUP BY feat.id
    ) AS inner
    INNER JOIN Feature_has_Applicability out_feat_app 
        ON out_feat_app.feature_id = inner.id
    INNER JOIN Applicability app 
        ON out_feat_app.applicability_id = app.id 
            AND app.name NOT LIKE '%N2%'
GROUP BY inner.id
HAVING count (*) = 1

我有一个多对多从功能到适用性在哪里
特色 id int主要 deleted_time 日期时间
适用性 id int主要 name 瓦尔查尔(45)
功能有适用性 feature_id 内景 applicability_id 内景
例子:
我有一个功能与适用性命名为n2和g6
我有功能b,适用于g6,n7
我有一个特性c和n2
我只希望功能b返回,因为它包括g6,但不包括n2。
对于与之有多对多关系的特征,g6是a,n2是b。

这似乎仍然返回适用于“n2”的特性。你能看出我做错了什么吗?谢谢您。

0ejtzxu1

0ejtzxu11#

您的第一个子查询似乎很好。就我个人而言,我不知道为什么你在没有看到数据库的情况下仍然只基于这个查询得到n2记录。可能是因为在查询中使用了大写的“n2”?运算符区分大小写。
尽管我建议你用 NOT EXISTS . 这会使代码更易于理解。试试这个:

SELECT *
FROM 
  features feat
  INNER JOIN feature_has_applicability feat_app ON feat_app.feature_id = feat.id
  INNER JOIN applicability app ON app.id = feat_app.applicability_id
    AND app.name LIKE '%G6%'
WHERE
  feat.delete_time = '0000-00-00 00:00:00'
  AND NOT EXISTS (
    SELECT
       *
    FROM
      feature_has_applicability out_feat_app
      INNER JOIN applicability out_app ON out_app.id = out_feat_app.applicability_id
        AND app.name LIKE '%N2%'
    WHERE
      out_feat_app.feature_id = feat.id
   )

使用 NOT EXISTS 帮助简化代码。因此在本例中,主查询更容易理解,我们希望在其中查找具有“g2”适用性的特征记录。但是,我们只希望所选功能记录的id不具有“n2”适用性的记录。
我搞不懂 GROUP BY 以及 HAVING count(*) = 1 . 如果您按id对它进行分组,并期望每个组只有一个记录,那么这是否意味着每个过滤的功能记录只有一个“g6”记录,因此您不必担心过滤掉“n2”记录?除非有一些奇怪的情况,比如“g6”和“n2”关键字出现在同一个适用性记录中。
另一个指针,对于您的子查询,您不应该使用保留关键字作为标识符。在本例中,您将子查询称为“inner”,这是一种不好的做法,可能根本无法在其他数据库引擎中运行。也许你可以称之为“g2\u特性”。

相关问题