仅当值存在于 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 中的列仅以保存已存在于同一表的另一列中的值? [复制]