[英]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.