[根据要求编辑于10/03/2019] 数据集很大,需要将不同行上的2个ID映射到一个“冲突ID”。
例如。
这些行必须归因于单个值“ Apples&Pears”。
然后我需要通过此值,而不只是其中一个,来知道哪些人同时具有“ Apple”和“ Pears”。
这是多对一的关系,必须完成。如果用户不具备“苹果和梨”的要求,则不能将其归为“苹果和梨”。
我对每个水果到每种组合都有一个一对一关系的主表,但是如果用户同时拥有两个水果,则只希望它们与用户表连接。
表1:用户,水果
表2:水果,产品
表3(我想实现的结果):
答案 0 :(得分:0)
欢迎使用S / O。通常,您希望提供更实际的示例表结构和数据,以至少对您的问题至关重要。如果有的话,则要进行整理,但要保持准确的上下文。
话虽这么说,我认为您实际上没有一桌苹果,梨,苹果和梨,但我会继续玩下去。
我假设(例如)您有一个人表,并且在子表中有另一个人表。我首先要对每个与“ apples&pears”记录有关联的人进行联接,然后对同一个子表进行一次LEFT-JOIN(一次用于苹果,另一次用于梨)。您可以确定要对结果进行的处理(例如从单个苹果,梨子记录中删除)。
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'
由于第一个“(内部)加入”明确地寻找那些同时被标记为苹果和梨的记录,因此将列表最小化为仅那些通过资格预审的人。
那时,两个“左加入”分别明确地寻找其他个性化的“苹果”和“梨”。
通过测试IS NULL会指示该人是否(或不通过NULL)拥有该物品。
如果您只想退回那些属于Apples&Pears且具有一个或两个其他单独项目的产品,则可以在末尾添加WHERE子句,例如
WHERE
justApples.PersonID IS NOT NULL
OR justPears.PersonID IS NOT NULL
一个相反的方法是预先鉴定justApples和justPears,并且不标记为与Apples and Pears相关,例如通过要求单独加入苹果和梨的联接并左键联接组合记录
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'
这两个连接到单个需要每个单独的零件,并且如果它们也标记为组合条目,则LEFT-JOIN显示。正如您在问题中的模棱两可所见,在所需内容中提供更多细节可以极大地帮助您更准确地回答您的真实需求。尽量不要在上下文中掩盖细节,而在需要关注更多私人问题的地方掩盖样本数据本身。