不同的sql行

不同的sql行,sql,sql-server-2008,join,distinct,Sql,Sql Server 2008,Join,Distinct,我试图连接两行,只获取第一行中包含的行的地址,但无法获取要计数的值。我有以下查询,它总共生成55059条记录: SELECT AccountID, AccountParameter1 FROM AccountBaseExtension 如果我使用以下sql,我会得到总计110118的重复行: SELECT AccountID, AccountParameter1, AddressParameter1 FROM Accoun

我试图连接两行,只获取第一行中包含的行的地址,但无法获取要计数的值。我有以下查询,它总共生成55059条记录:

SELECT 
      AccountID,
      AccountParameter1 
 FROM AccountBaseExtension
如果我使用以下sql,我会得到总计110118的重复行:

SELECT 
      AccountID,
      AccountParameter1,
      AddressParameter1 
 FROM AccountBaseExtension AS A
INNER JOIN CustomerAddressBase AS B ON a.AccountID = b.ParentID
我试图将其区分开来,以便仅检索客户地址的邮政编码,但下面的查询将生成56496条记录

SELECT 
      DISTINCT AccountID,
      AccountParameter1,
      AddressParameter1 
 FROM AccountBaseExtension AS A
INNER JOIN CustomerAddressBase AS B ON a.AccountID = b.ParentID

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

AccountID是主键的一部分还是唯一约束的一部分?可能的原因可能是,

  • AccountID、AccountParameter1和AddressParameter1的组合重复

    测试:尝试在查询中包含AccountBaseExtension的唯一列。使用和不使用distinct关键字执行它

  • AddressParameter1在地址表中不唯一

    测试:尝试包含地址表的唯一列,并使用和不使用不同的表进行查询。例如,可能存在以下记录:

"


原因是表
AccountBaseExtension
CustomerAddressBase
之间存在
1-->许多关系。因此,
JOIN
获取的记录比第一个表中的记录多。对于同一AccountID,可能存在多个
AddressParameter1
。因此,如果包含此列,则得到的行数将比未包含此列时略多。对于理货结果,您可以使用:

SELECT DISTINCT
      AccountID,
      AccountParameter1 
 FROM AccountBaseExtension AS A
INNER JOIN CustomerAddressBase AS B ON a.AccountID = b.ParentID
或者您甚至可以尝试以下方法:

SELECT DISTINCT AccountID, AccountParameter1 FROM 
    (
    SELECT 
          AccountID,
          AccountParameter1,
          AddressParameter1 
     FROM AccountBaseExtension AS A
    INNER JOIN CustomerAddressBase AS B 
    ON a.AccountID = b.ParentID
    )A

原因可能是
1-->表
AccountBaseExtension
CustomerAddressBase
之间存在许多关系。I.可能有多个B.Palund用于相同的A.Actudio。例如,考虑下面的表。

AccountBaseExtension

*---------------*-------------------*
|AccountID      |AccountParameter1  |               count=1
*---------------*-------------------*
|123            |xyzc               |
*---------------*-------------------*
客户地址库

*---------------*-------------------*
|ParentID       |AddressParameter1  |                count=3
*---------------*-------------------*
|123            |Addr1              |
*---------------*-------------------*
|123            |Addr2              |
*---------------*-------------------*
|123            |Addr2              |
*---------------*-------------------*
挑选 帐户ID, AccountParameter1, 地址参数1 从AccountBaseExtension作为 a.AccountID=B.ParentID上作为B的内部联接CustomerAddressBase 将导致

*---------------*-------------------*------------------*
|AccountID      |AccountParameter1  |AddressParameter1 |     count=3
*---------------*-------------------*------------------*
|123            |xyzc               |Addr1             |
*---------------*-------------------*------------------*
|123            |xyzc               |Addr2             | 
*---------------*-------------------*------------------*
|123            |xyzc               |Addr2             | 
*---------------*-------------------*------------------*

而使用distinct只会生成2个项的输出。

很抱歉,在post中应该提到,其SQL server 2008在CustomerAddressBase中是b.parentID唯一的?accountID是主键您可以使用accountID、AccountParameter1、AddressId进行尝试吗?地址表中可能有多个地址具有相同的AddressParameter..编辑了第二个查询。记录的数量现在应该减少了。但我永远不会同意,如果从SELECT子句中删除第三列,记录的数量会增加。如果有什么变化的话,它应该变小。再试一次,伙计。这并不能解释带“Distinct”和不带“Distinct”的查询的结果计数的差异。@TavoloPerUno更新了我的答案。尝试从CustomerAddressBase中选择ParentID、AddressParameter1(带和不带DISTINCT),查看CustomerAddressBase中是否有重复行
*---------------*-------------------*------------------*
|AccountID      |AccountParameter1  |AddressParameter1 |     count=3
*---------------*-------------------*------------------*
|123            |xyzc               |Addr1             |
*---------------*-------------------*------------------*
|123            |xyzc               |Addr2             | 
*---------------*-------------------*------------------*
|123            |xyzc               |Addr2             | 
*---------------*-------------------*------------------*