不同的sql行

时间:2015-04-11 05:27:02

标签: sql sql-server-2008 join distinct

我正在尝试连接两行并仅获取第一行中包含的行的地址,但我无法获取值来计算。我有以下查询,结果共计5559条记录:

SELECT 
      AccountID,
      AccountParameter1 
 FROM AccountBaseExtension

如果我使用以下sql,我会得到总共110,118的重复行:

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

我试图让它与众不同,以便我只是检索客户地址的邮政编码,但下面的查询产生了569条记录

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

任何人都能告诉我这里做错了什么?

3 个答案:

答案 0 :(得分:0)

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

  • AccountID,AccountParameter1,AddressParameter1有重复的组合。

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

  • AddressParameter1在地址表中不唯一。

    测试:尝试包含Address表的唯一列,并使用和不使用distinct表进行查询。例如,可能会有以下记录:

AccountID                     AccountParameter1        AddressParameter1     ParentID

10223490                      Cisco                    West Tasman Dr        1
10223490                      Cisco                    West Tasman Dr        2

答案 1 :(得分:0)

原因可能是表1-->manyAccountBaseExtension之间存在CustomerAddressBase关系。即对于相同的a.AccountID,可能有多个b.parentID。例如,考虑下面的表。

<强> AccountBaseExtension

*---------------*-------------------*
|AccountID      |AccountParameter1  |               count=1
*---------------*-------------------*
|123            |xyzc               |
*---------------*-------------------*

<强> CustomerAddressBase

*---------------*-------------------*
|ParentID       |AddressParameter1  |                count=3
*---------------*-------------------*
|123            |Addr1              |
*---------------*-------------------*
|123            |Addr2              |
*---------------*-------------------*
|123            |Addr2              |
*---------------*-------------------*

选择       帐户ID,       AccountParameter1,       AddressParameter1  来自AccountBaseExtension AS A. INNER JOIN CustomerAddressBase AS B ON a.AccountID = b.ParentID 将导致

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

使用 distinct 只会产生 2 项的输出。

答案 2 :(得分:-1)

原因是表1-->manyAccountBaseExtension之间存在CustomerAddressBase关系。因此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