首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL -在多到多表中找到不同的1到1关系值。

SQL -在多到多表中找到不同的1到1关系值。
EN

Stack Overflow用户
提问于 2022-07-05 02:57:14
回答 1查看 26关注 0票数 0

对于某些上下文:我试图在DTH、TPD或IP 3种可能的保险类型中找到只有1种保险类型的任何成员。现在,1名成员可以有1或2或所有类型的保险。

现在我在SQL中有2列,A列有成员号,如果成员有多种类型的保险,则可以重复该成员的成员号。B栏有明显包含重复保险的保险类型。

如何筛选我的查询,以查找仅具有IP类型保险的A列中的成员。我试着使用‘不喜欢’和‘不在’操作符来筛选我想要的保险类型,但是我仍然得到一些成员也有我不想要的其他类型的保险,我甚至不能导出数据到excel,并手动检查,因为数据量太大了。例如,我希望只有IP、DTH或TPD的成员。有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2022-07-05 03:09:57

一般来说,这些成员只有一份记录(一种保险):

代码语言:javascript
复制
SELECT 
    member,
    COUNT(member) as total
FROM Table 
GROUP BY member
HAVING COUNT(member) = 1;

这里的想法是,如果一个成员有一种保险,你会看到一条记录,所以计数是(1),但是如果一个成员有两种保险,他们就有两种记录,所以计数是(2),以此类推。

接下来,为了更详细地了解它们,既然您现在知道您感兴趣的成员,只需使用该结果集再次连接到原始表:

代码语言:javascript
复制
SELECT A.*
FROM Table A
INNER JOIN  
(
    SELECT 
        member,
        COUNT(member) as total
    FROM Table 
    GROUP BY member
    HAVING COUNT(member) = 1
) B
ON A.member = B.member;

现在,您可以看到这些成员的详细信息(保险类型)。

现在,你说“B列有明显包含重复保险的保险类型”。这是有点不清楚,但如果你真的是这个意思,那么你将不得不删除重复,所以,与上面一样,但更多的数据清理。例如,如果您的数据有一个成员( DTH类型为一行,而类型为TPD )为两行,则需要这样做,因此我们希望对该成员进行计数(2),而不是(3)!

代码语言:javascript
复制
SELECT 
    X.member,
    COUNT(X.member) as total
FROM (SELECT DISTINCT member, type FROM Table) X
GROUP BY X.member
HAVING COUNT(X.member) = 1;

对于同样的更完整的版本:

代码语言:javascript
复制
SELECT DISTINCT A.*
FROM Table A
INNER JOIN  
(
    SELECT 
        X.member,
        COUNT(X.member) as total
        FROM (SELECT DISTINCT member, type from Table) X
        GROUP BY X.Member
        HAVING COUNT(X.member) = 1
) B
ON A.member = B.member
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72863557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档