不同的sql行
我试图连接两行,只获取第一行中包含的行的地址,但无法获取要计数的值。我有以下查询,它总共生成55059条记录:不同的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
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 |
*---------------*-------------------*------------------*