日益复杂的领域减少了不同的价值?

时间:2014-02-19 22:21:16

标签: sql sql-server sql-server-2008 tsql

当我增加字段的复杂性时,为什么我会减少返回的行数?

我需要使用相同的模式合并2个表。

问题是相同记录的PK不一样

例如,我正在尝试合并这两个表:

+--------------------------------------+--------+----------+
|              columna                 |columnb | columnc  |
+--------------------------------------+--------+----------+
| EE75442D-C41F-4AE4-A0B5-8459E3CBDEAC | donkey |        3 |
| 7E27434F-BC62-489B-97F4-7685BDA663D7 | horse  |        5 |
| 2344CB35-D4BB-4BFA-8869-797A8BE7C235 | cat    |        3 |
| DDB81938-D6A1-4435-96F2-C901785C5216 | cat    |        4 |
+--------------------------------------+--------+----------+

这一个:

+--------------------------------------+--------+----------+
|              columna                 |columnb | columnc  |
+--------------------------------------+--------+----------+
| BF01AD4B-0FBF-4653-9E02-20C640451AF8 | donkey |        3 |
| 7A8ED2BD-F844-49A9-B8EC-37B360030580 | horse  |        5 |
| 1CDB2B1A-AB8F-44D6-A933-B12A6FE87D71 | cat    |        3 |
| D8D98F48-9BDF-4009-96AF-76DEC49E0856 | cat    |        4 |
+--------------------------------------+--------+----------+

我在两个表中都有一个很好的主键: columna

不幸的是,它没用,因为我没有为同一记录保留相同的PK。

我试图找到一个可以连接并创建一个独特字段的字段组合。例如,这将返回303139条记录:

;with cte_unique as (
       select (cast (parentcustomerid as  NVARCHAR(36)) + vth_contactnumber)  as uniqueColumn from contact)

       select COUNT(distinct uniquecolumn) from cte_unique

然而,当我通过将另一个字段连接到 uniquecolumn 来增加字段的复杂性时:

   ;with cte_unique as (
   select (cast (parentcustomerid as  NVARCHAR(36)) + vth_contactnumber+mobilephone)  as uniqueColumn from contact)

   select COUNT(distinct uniquecolumn) from cte_unique

* 我的行数实际上更少* 160981

1 个答案:

答案 0 :(得分:3)

不要连接。连接NULL会导致NULL。尝试

WITH CTE
     AS (SELECT DISTINCT parentcustomerid,
                         vth_contactnumber,
                         mobilephone
         FROM   contact)
SELECT COUNT(*)
FROM   CTE 

如果该组合是唯一的,您可以使用

上的连接
SELECT *
FROM   contact c
       JOIN other_table t
         ON EXISTS(SELECT t.parentcustomerid,
                          t.vth_contactnumber,
                          t.mobilephone
                   INTERSECT
                   SELECT c.parentcustomerid,
                          c.vth_contactnumber,
                          c.mobilephone)