繁体   English   中英

当我只想要一行时,SQL JOIN 返回多行

[英]SQL JOIN returning multiple rows when I only want one row

我的大脑一天很慢...

我加入的表:

政策办公室:

 PolicyNumber    OfficeCode
      1             A
      2             B
      3             C
      4             D
      5             A

办公信息:

 OfficeCode      AgentCode      OfficeName
      A             123             Acme 
      A             456             Acme
      A             789             Acme
      B             111             Ace
      B             222             Ace
      B             333             Ace
     ...            ...             ....

我想执行搜索以返回与办公室名称相关的所有政策。 例如,如果我搜索“Acme”,我应该得到两个策略:1 和 5。

我当前的查询如下所示:

SELECT
   *
FROM
   Policy_Office P
   INNER JOIN Office_Info O ON P.OfficeCode = O.OfficeCode
WHERE
   O.OfficeName = 'Acme'

但是这个查询返回多行,我知道这是因为第二个表中有多个匹配项。

如何编写查询以仅返回两行?

SELECT  DISTINCT a.PolicyNumber
FROM    Policy_Office a
        INNER JOIN Office_Info b
            ON a.OfficeCode = b.OfficeCode
WHERE   b.officeName = 'Acme'

要进一步了解联接,请访问以下链接:

简单连接返回两组的笛卡尔乘法,第一个表中有2 A,第二个表中有3 A,你可能得到6个结果。 如果您只想要保单编号,那么您应该对其进行区分。

(使用 MS-Sqlserver)

我知道这个线程已有 10 年历史,但我不喜欢不同(在我的脑海中,这意味着引擎收集所有可能的数据,将每条记录中的每个选定行计算到 hash 并将其添加到由该 hash 排序的树中; 我可能错了,但似乎效率低下)。

相反,我使用CTE和 function row_number() 该解决方案很可能是一种慢得多的方法,但它很漂亮,易于维护,我喜欢它:

给定的是一个人和一张电话表,用外键(在电话表中)捆绑在一起。 这种结构意味着一个人可以有更多的数字,但我只想要第一个,这样每个人在结果集中只出现一次(我应该能够将多个电话号码连接成一个字符串(我认为是枢轴),但这是另一个问题)。

; -- don't forget this one!
with telephonenumbers
as
(
  select [id]
       , [person_id]
       , [number]
       , row_number() over (partition by [person_id] order by [activestart] desc) as rowno
  from [dbo].[telephone]
  where ([activeuntil] is null or [activeuntil] > getdate()
)
select p.[id]
      ,p.[name]
      ,t.[number]
from [dbo].[person] p
left join telephonenumbers t on     t.person_id = p.id
                                and t.rowno = 1

这可以解决问题(实际上最后一行可以),并且语法可读且易于扩展。 这个例子很简单,但是当创建连接表左右(字面意思)的大型脚本时,很难避免结果包含不需要的 duplets - 并且难以识别哪些表创建了它们。 CTE 对我很有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM