选择if distinct count> 2?

问题描述 投票:0回答:1

[根据要求编辑10/03/2019]拥有一个大型数据集,需要将不同行上的2个ID映射到一个“冲突ID”。

例如。

这些行必须归结为单个值“Apples&Pears”。

然后,我需要知道哪些人同时拥有“Apple”和“Pears”,而不仅仅是其中之一。

这是多对一的关系,必须完整。如果用户没有同样的要求,则不得将用户归为“苹果和梨”。

我有每个组合的每个水果的一对一关系的主表,但是如果用户同时拥有两个水果,则只希望它们与用户表连接。


表1:用户,水果

  • 乔什,苹果
  • 乔希,梨
  • 汤姆苹果
  • 凯特,梨

表2:水果,产品

  • 苹果,苹果和梨
  • 梨,苹果和梨

表3(我想要达成的结果):

  • Josh,Apple,Apples&Pears
  • 乔希,梨,苹果和梨
  • 汤姆,苹果,NULL
  • 凯特,皮尔,巴特
sql
1个回答
0
投票

欢迎来到S / O.通常,您希望提供更逼真的样本表结构和数据,以描绘至少对您的问题至关重要。如果有私人数据,弥补,但保持准确的上下文。

话虽如此,我认为你实际上并没有苹果,梨,苹果和梨的表,但我会一起玩。

我假设(示例)您有一个人员表,以及他们在子表中关联的另一个表。我会先为每个人加入一个与“苹果和梨”记录相关联的人,然后对同一个子表进行LEFT-JOIN一次用于苹果,另一个用于梨。您可以确定要对结果执行的操作(例如从单个apple,pear子记录中删除)。

Select
      p.LastName,
      p.FirstName,
      case when justApples.PersonID IS NULL 
           then 'No' else 'Yes' end as AlsoHasApples,
      case when justPears.PersonID IS NULL 
           then 'No' else 'Yes' end as AlsoHasPears
   from
      Person p
         JOIN Fruits f
            on p.PersonID = f.personID
            AND f.Description = 'Apples & Pears'
         LEFT JOIN Fruits justApples
            on p.PersonID = justApples.PersonID
            AND f.Description = 'Apples'
         LEFT JOIN Fruits justPears
            on p.PersonID = justPears.PersonID
            AND f.Description = 'Pears'

由于第一个“(内部)JOIN”明确地寻找那些标记为苹果和梨记录的那些,因此将列表最小化为仅限于那些预先限定的人。

那么,两个“LEFT-JOIN”分别明确地寻找其他个性化的“苹果”和“梨子”。

通过测试IS NULL将指示该人是否(或不通过NULL)具有该项。

如果您只想返回苹果和梨的那些并且拥有其中一个或两个单独的项目,您可以在最后添加WHERE子句,例如

WHERE
      justApples.PersonID IS NOT NULL
   OR justPears.PersonID IS NOT NULL

反向是对justApples和justPears进行预先鉴定,并且不标记为与苹果和梨相关联,例如通过单独地将JOINS连接到苹果和梨以及LEFT-JOIN组合记录

Select
      p.LastName,
      p.FirstName,
      case when f.PersonID IS NULL 
           then 'No' else 'Yes' end as IsAssociatedWithApplesAndPearsRecord
   from
      Person p
         JOIN Fruits justApples
            on p.PersonID = justApples.PersonID
            AND f.Description = 'Apples'
         JOIN Fruits justPears
            on p.PersonID = justPears.PersonID
            AND f.Description = 'Pears'
         LEFT JOIN Fruits f
            on p.PersonID = f.personID
            AND f.Description = 'Apples & Pears'

两个连接到单个REQUIRE的每个单独部分,LEFT-JOIN显示它们也被标记为组合条目。正如您在问题中的模糊性所看到的那样,提供您想要的更多细节可以显着帮助您更准确地回答您的真实需求。尽量不要将细节掩盖到上下文中,但是在更多私有问题需要关注的地方掩盖样本数据。

© www.soinside.com 2019 - 2024. All rights reserved.