Sql server 当我在视图上运行查询时,我在sql server中得到了两条唯一id的记录

Sql server 当我在视图上运行查询时,我在sql server中得到了两条唯一id的记录,sql-server,Sql Server,在SqlServer Member和MemberAddress中有两个表,通过执行以下查询生成一个视图vw_成员 SELECT m.MemberId, m.MemberName, m.EndCustomer, m.ExpirationDate, ma.DEA, ma.HIN, ma.Address1, ma.Address2, ma.City, ma.State, ma.OfficeConta

在SqlServer Member和MemberAddress中有两个表,通过执行以下查询生成一个视图vw_成员

SELECT     
   m.MemberId, 
   m.MemberName, 
   m.EndCustomer,  
   m.ExpirationDate, 
   ma.DEA, 
   ma.HIN,  
   ma.Address1, 
   ma.Address2,  
   ma.City, 
   ma.State,  
   ma.OfficeContact,
   ma.OfficeContactTitle,  
   ma.OfficeContactEmail  
FROM dbo.Member m
   INNER JOIN dbo.MemberAddress ma ON (m.MemberId = ma.MemberId)
但问题是,我正在为唯一MemberId生成两条记录


有人能告诉我我做错了什么吗

Wild guess-在
MemberAddress
中有两行具有相同的
MemberId
。也许里面有一些地址类型的概念模型?如果是这样,您需要决定哪些地址类型应该包含在此视图中,或者如果您总是需要地址,则需要决定如何对地址类型进行优先级排序

第二,FROM子句可能类似于:

FROM
    dbo.Member m
        INNER JOIN  
    dbo.MemberAddress ma
        ON
            m.MemberId = ma.MemberId
        LEFT JOIN
    dbo.MemberAddress ma_anti
        ON
            m.MemberId = ma_anti.MemberId and
            ma_anti.AddressType > ma.AddressType --priority decision
WHERE
    ma_anti.MemberId is null
如果与
ma_anti
的连接试图从
MemberAddress
中找到一个比从
ma
中选择的行“更好”的行-如果连接成功,您不希望该行出现在最终结果集中,因此
Where
子句就是这样做的。

  • 双成员ID行是否为有效值?
    • 一个会员能有更多的地址吗
    • 行内容是否有差异

使数据符合模式
  • dbo.Member.MemberId应该是主键
  • dbo dbo.MemberAddress.MemberId应该是映射到Member.MemberId的外键

如果您有这些成员的多个地址,是否有人(询问者/主持人)可以正确格式化代码。内部联接将把成员id与它们中的每一个联接起来。这个结果没有错,但显然不是你所需要的。为了进一步帮助你,你必须提供更多关于你需要的结果的信息。