两类SQL查询需求:列条目全比较与NIST 800-53a邻接表ID验证
嘿,咱们来逐个解决这两个SQL问题,都是很常见的场景,我会把解法讲得明明白白:
需求一:实现某列每个条目与另一列每个条目逐一比较
要做到这种全量的逐一比对,核心是生成两列的笛卡尔积(也就是所有可能的组合),然后在结果里加上你需要的比较逻辑就行。分两种情况来看:
如果是同一张表中的两列(比如表叫
your_table,列是col_a和col_b):
用自交叉连接就能拿到所有组合,再添加比较判断,比如判断是否相等、大小关系:SELECT t1.col_a, t2.col_b, t1.col_a = t2.col_b AS is_equal, t1.col_a > t2.col_b AS is_a_greater FROM your_table t1 CROSS JOIN your_table t2;如果是不同表的两列(比如表A的
col_x和表B的col_y):
同样用交叉连接关联两个表,再做比较:SELECT a.col_x, b.col_y, a.col_x LIKE CONCAT('%', b.col_y, '%') AS contains_value -- 举个模糊匹配的例子 FROM table_a a CROSS JOIN table_b b;
⚠️ 注意:如果表的数据量很大,交叉连接会生成非常多的行,可能影响性能,所以执行前最好确认数据规模。
需求二:检查每个ID是否出现在parent列中
首先得明确:我们要保留表中所有的id,然后判断每个id有没有被其他条目的parent字段引用。你之前的查询失效,大概率是用了INNER JOIN——这种关联方式会直接过滤掉没有匹配的id,而那些未被使用的条目恰恰就是没有匹配的,所以才看不到结果。
给你两种靠谱的解法:
解法一:LEFT JOIN自关联(直观易读)
假设你的表名叫nist_800_53a_controls,列是id和parent:
SELECT main.id, CASE WHEN parent_refs.id IS NOT NULL THEN '已在parent列中出现' ELSE '未被任何parent引用' END AS parent_reference_status FROM nist_800_53a_controls main LEFT JOIN ( -- 先提取所有非空的parent值,去重避免重复匹配 SELECT DISTINCT parent AS id FROM nist_800_53a_controls WHERE parent IS NOT NULL ) parent_refs ON main.id = parent_refs.id;
解法二:EXISTS子查询(性能更优)
如果表的数据量很大,用EXISTS会更高效,因为它找到匹配就会停止检索,不用遍历全表:
SELECT id, -- 返回TRUE/FALSE(或1/0,取决于你的SQL方言) EXISTS ( SELECT 1 FROM nist_800_53a_controls sub WHERE sub.parent = main.id ) AS is_referenced_in_parent FROM nist_800_53a_controls main;
两种方法都能完整保留所有id,并准确显示每个id是否被parent字段引用,完美解决你说的“未被使用的条目”检测问题。
内容的提问来源于stack exchange,提问作者Matthew Buehlmann
相关产品推荐
相关产品推荐

