2011-06-22 4 views
0

重複する値をキャッチしたいテーブルがあります。結果をクエリから切り離すにはどうすればよいですか?

これらの結果をキャッチした後、これらの結果を別々の行に分けたいと思います。

表:

CREATE TABLE [dbo].[ContactTable](
[contactid] [int] IDENTITY(1,1) NOT NULL, 
[telephone1] [varchar](100) NULL, 
[telephone2] [varchar](100) NULL, 
[fullname] [varchar](100) NOT NULL 
) ON [PRIMARY] 

数値:

insert into ContactTable(telephone1, telephone2,fullname) values('123','1234','danny') 
insert into ContactTable(telephone1, telephone2,fullname) values('123','1234','danny1') 
insert into ContactTable(telephone1, telephone2,fullname) values('123*','1234#','martin') 
insert into ContactTable(telephone1, telephone2,fullname) values('1243*','15234#','martin') 
insert into ContactTable(telephone1, telephone2,fullname) values('1243','15234','martin1') 

重複値引くためのクエリ:

SELECT  Phones, COUNT(Phones) AS CountPhones 
FROM  
(
    SELECT  Phones, contactid 
    FROM 
    (
     SELECT  telephone1 AS Phones, contactid 
     FROM   ContactTable 
     WHERE  (telephone1 IS NOT NULL) 
     UNION ALL 
     SELECT  REPLACE(telephone1, '*', '') AS Phones, contactid 
     FROM   ContactTable 
     WHERE  (telephone1 IS NOT NULL) AND (telephone1 LIKE '%*') 
     UNION ALL 
     SELECT  REPLACE(telephone1, '#', '') AS Phones, contactid 
     FROM   ContactTable 
     WHERE  (telephone1 IS NOT NULL) AND (telephone1 LIKE '%#') 
     UNION ALL 
     SELECT  telephone2 AS Phones, contactid 
     FROM   ContactTable 
     WHERE  (telephone2 IS NOT NULL) 
     UNION ALL 
     SELECT  REPLACE(telephone2, '*', '') AS Phones, contactid 
     FROM   ContactTable 
     WHERE  (telephone2 IS NOT NULL) AND (telephone2 LIKE '%*') 
     UNION ALL 
     SELECT  REPLACE(telephone2, '#', '') AS Phones, contactid 
     FROM   ContactTable 
     WHERE  (telephone2 IS NOT NULL) AND (telephone2 LIKE '%#') 
    )as Tel 
    GROUP BY Phones, contactid 
) as T 
GROUP BY Phones 
HAVING  (COUNT(*) > 1) 
ORDER BY CountPhones DESC 

結果:

telephone Count 
--------- ----- 
123  3 
1234  3 
1243  2 
15234  2 

しかし、私はこのような結果を取得したい:

id telephone fullname 
-- --------- -------- 
1 123  danny 
2 123  danny1 
3 123  martin 
3 1234  martin 
1 1234  danny 
2 1234  danny1 
5 1243  martin1 
4 1243  martin 
4 15234  martin 
5 15234  martin1 

がどのように私はそれを行うにはできますか?

+0

重複をどのように定義しますか? – gbn

+0

値 - 電話番号123または123#または123 *の電話を持っている場合の例です。したがって、3つの重複があります。 –

答えて

0
SELECT * FROM (
SELECT 
    contactid AS id, 
    REPLACE(REPLACE(telephone1, '*', ''), '#', '') AS telephone, 
    fullname 
FROM 
    ContactTable 
UNION ALL 
SELECT 
    contactid AS id, 
    REPLACE(REPLACE(telephone2, '*', ''), '#', '') AS telephone, 
    fullname 
    FROM ContactTable) AS all_phones 
WHERE all_phones.telephone in (
    SELECT phone FROM (
     SELECT 
      COUNT(*) AS pnumber, 
      phone 
     FROM (
      SELECT 
       REPLACE(REPLACE(telephone1, '*', ''), '#', '') AS phone 
      FROM 
       ContactTable 
      UNION ALL 
      SELECT 
       REPLACE(REPLACE(telephone2, '*', ''), '#', '') AS phone 
      FROM 
       ContactTable) AS phones 
      GROUP BY phone) 
     AS phone_numbers WHERE pnumber > 1) 
+0

ここで私はすべての電話を取得しますが、私は重複する値に関連するすべての行を取得したいだけ.. –

関連する問題