【问题标题】:SQL query to return difference between table joined to itselfSQL查询返回连接到自身的表之间的差异
【发布时间】:2013-06-30 14:55:34
【问题描述】:

我使用的是 SQL Server 2012。

我有一个名为 AdvApp.vPortfolioGroupMemberFlattened 的视图 我想返回投资组合组代码 ma​​ster 或投资组合组代码 open 但不在两个组中的所有成员 ID。我不关心其他组的成员。

以下 stackoverflow 文章接近我需要的内容,但在将表连接到自身时似乎不起作用。

sql query to return differences between two tables

这是我的桌子。

PortfolioGroupCode  MemberID    MemberCode
master              316         abc
master              317         def
open                316         abc
open                317         def
open                321         ghi
master              322         jkl
closed               89         lmn

这是我想要的结果,显示了 master 和 open 成员之间的差异。

PortfolioGroupCode  MemberID    MemberCode
open                321         ghi
master              322         jkl

我尝试了以下两个查询,均来自上述文章。

SELECT A.*, B.*
FROM [AdvApp].[vPortfolioGroupMemberFlattened] a
FULL JOIN [AdvApp].[vPortfolioGroupMemberFlattened] b
ON (A.PortfolioGroupCode = B.PortfolioGroupCode)
WHERE A.PortfolioGroupCode IS NULL OR B.PortfolioGroupCode IS NULL

SELECT DISTINCT a.membercode, a.portfoliogroupcode
FROM [AdvApp].[vPortfolioGroupMemberFlattened] a
WHERE (
NOT EXISTS (
SELECT b.membercode
FROM [AdvApp].[vPortfolioGroupMemberFlattened] b
WHERE a.PortfolioGroupCode = 'master'
AND b.PortfolioGroupCode = 'open'
))

【问题讨论】:

    标签: sql left-join sql-server-2012 self-join not-exists


    【解决方案1】:

    此作品注意与这些行的区别

     and a.PortfolioGroupCode = 'master'
     and b.PortfolioGroupCode = 'open'
    

    工作查询

    select distinct PortfolioGroupCode,  MemberID,    MemberCode 
    from AdvApp.vPortfolioGroupMemberFlattened  
    where memberID not in (
         select distinct a.memberID from AdvApp.vPortfolioGroupMemberFlattened  a, AdvApp.vPortfolioGroupMemberFlattened  b
         where a.memberId = b.memberID 
         and a.PortfolioGroupCode = 'master'
         and b.PortfolioGroupCode = 'open'
         and a.PortfolioGroupCode <> b.PortfolioGroupCode) 
    and PortfolioGroupCode in ('open','master')
    

    【讨论】:

      【解决方案2】:
      select distinct PortfolioGroupCode,  MemberID,    MemberCode 
      from test 
      where memberID not in (
           select distinct a.memberID from test a, test b
           where a.memberId = b.memberID 
           and a.PortfolioGroupCode in ('open','master')
           and a.PortfolioGroupCode <> b.PortfolioGroupCode) 
      and PortfolioGroupCode in ('open','master')
      

      这里是DEMO

      【讨论】:

      • 查询分析器向我显示 temp;是。无论有没有分号,我都会收到此错误。我也可以删除温度;并且查询运行,但这不是正确的结果。谢谢
      • 我可以让你的测试工作,但由于某种原因在实际数据库中返回的结果是空白的?
      • 我得到了它的工作,也许我需要提到 master 比 open 更大。 Open 是 master 的一个子集。我将包括上面的工作查询。
      猜你喜欢
      • 2011-01-05
      • 2021-11-05
      • 1970-01-01
      • 1970-01-01
      • 2015-07-12
      • 2017-03-13
      • 1970-01-01
      • 1970-01-01
      • 2018-08-29
      相关资源
      最近更新 更多