仅当值存在于 SQL 的另一列中时,如何选择列的值?

Posted

技术标签:

【中文标题】仅当值存在于 SQL 的另一列中时,如何选择列的值?【英文标题】:How do I select a column's values only if the values exist in another column in SQL? 【发布时间】:2018-11-13 18:34:33 【问题描述】:

我有一个稍微复杂的问题。有几列。从本质上讲,逻辑是有一堆标题。每个标题都有一个唯一的标识符,它们是一个系列的一部分。正如“现在表”中明显的那样,有几个不同的哥布林:哥布林、哥布林 2 和哥布林 3。如果它们是不同的标题,它们具有单独的唯一标识符,但由于它们都是哥布林,因此它们具有唯一的系列标识符。这些头衔/生物可以有任何家。但索伦只拥有巢穴中的那些。

我想弄清楚的是,与其他人拥有的其他东西相比,Sauron 拥有的东西占 Sauron 独有的百分比。因此,例如,吸血鬼是索伦唯一拥有的,因为没有其他人拥有它。如果 Sauron 拥有唯一的系列标识符,那么我想要它。

我想解决这个问题的方法是找到索伦所拥有的一切。根据 Sauron 拥有的唯一系列标识符,我想找到表中的所有内容。目前唯一的系列标识符很少,所以很容易像唯一系列标识符 = 'Gob' 那样手动输入它,但是如果有很多,我该怎么做呢?我想找到 Sauron 拥有的所有东西以及 Sauron 也拥有的唯一系列标识符的所有匹配项。因此,不属于 Sauron 的怪物和巨魔之类的东西不存在。并想象这张桌子是一百万或更多,而不是一小部分东西。

感谢您的帮助,对吐字表示抱歉,想不出更好的方法来解释这一点! :D

要展示的示例表

【问题讨论】:

【参考方案1】:

选择 Sauron 的所有唯一系列标识符。然后选择具有这些唯一系列标识符的所有标题。

select * from mytable 
where unique_series_identifier in 
(
  select unique_series_identifier
  from mytable
  where evil_lord = 'Sauron'
)
order by unique_series_identifier, unique_identifier;

我建议为此查询设置以下索引。一种是查找 Sauron 标题,另一种是按唯一系列标识符查找标题。

create index idx1 on mytable ( evil_lord, unique_series_identifier );
create index idx2 on mytable ( unique_series_identifier );

【讨论】:

【参考方案2】:

您需要至少有一个“Sauron”的“标题”。如果是这样,您可以使用窗口函数:

select t.*
from (select t.*,
             sum(case when evillord = 'Sauron' then 1 else 0 end) over (partition by title) as num_saurons
      from t
     ) t
where num_saurons > 0;

【讨论】:

以上是关于仅当值存在于 SQL 的另一列中时,如何选择列的值?的主要内容,如果未能解决你的问题,请参考以下文章

如果存在于列表中,则根据另一列的值选择列

如何将约束添加到 MYSQL 中的列仅以保存已存在于同一表的另一列中的值? [复制]

根据不同数据类型的另一列设置一列的默认值

如何根据 PySpark 数据框的另一列中的值修改列? F.当边缘情况

Oracle SQL:使用来自同一表的另一列的数据更新表

SQL join:当值不在一组值中时如何选择