我正在SQL服务器中编写一个查询,该查询可以跨两条路由之一加入。在最常见的情况下,两条路由之一之间将有一个链接。问题是,如果两个路由都有效,则结果将包含重复的行。我想了解我是否可以编写查询以避免重复行,而无需简单地在其前面添加"不同"。
该查询旨在显示存储在当事方表中的用户与他们有权访问的合同之间的连接。
如果用户被分配到特定公司,他们可以通过以下途径进行访问:
party (user) -> party_party_relationship -> party (company)
-> contract (via company_party_id column)
但是,用户也可以被分配到类似于公司的"工作提供者",并且还可以通过类似的途径让他们访问合同:
party (user) -> party_party_relationship -> party (work provider)
-> contract (via work_provider_id column)
在简单场景中,用户只能通过两条路由之一获得链接,而实际上只有一个公司或单个工作提供者,我可以编写一个简单的查询,将 join 留给每个路由,如下所示:
select p.party_id as user_id,con.CONTRACT_ID
from contract con
left join party_party_rlship company_rlship on con.company_party_id =
company_rlship.child_party_id
and company_rlship.nature = 'USER_COMPANY'
left join party_party_rlship work_provider_rlship on
con.WORK_PROVIDER_PARTY_ID = work_provider_rlship.CHILD_PARTY_ID
and work_provider_rlship.NATURE='USER_CLIENT'
inner join party p on company_rlship.PARENT_PARTY_ID = p.party_id
or work_provider_rlship.PARENT_PARTY_ID = p.party_id
问题是在更复杂的方案中,将返回重复的行。据我所知,有两种不同的原因会返回欺骗:
- 可以通过公司和工作提供者两次链接到同一合同。
- 即使您的公司将您链接到与您的工作提供者的不同合同,只需同时拥有两者,第二个左边的连接也会引起"多重"效应。 即,如果用户链接到三家公司和两个工作提供者,则第一个左边连接将创建三行,然后执行第二个左边连接会将每个加入到两个工作提供者行, 给六行。
有没有办法构建此查询以避免重复,而无需简单地在前面添加"不同"?我使用的是 SQL Server 2012。
意识到我在这里做错了什么。尽管联接有两个路由,但它们都在同一个表上,因此这应该是单个内部联接,条件为通过公司或工作提供者加入,如下所示:
select distinct con.contract_id,ppr.parent_party_id as party_id
from contract con
join party_party_rlship ppr on
((con.company_party_id = ppr.child_party_id and ppr.nature = 'USER_COMPANY')
or (con.work_provider_party_id = ppr.child_party_id
and ppr.NATURE = 'USER_CLIENT'))
在最坏的情况下,每个用户将被链接两次,并且可以单独删除这些重复。就我而言,有 3000 个合约,所以最坏的情况是每个用户都链接到 6000 个。相比之下,与前两个外部联接相比,我正在创建重复项的交叉乘积。因此,3000 个合约可能导致每个用户 900 万行!
此外,完全没有必要最终加入派对表。我只需要party_party_relationship表中的派对 ID。