2

以下のようなテーブルがあります(SQL Server 2008 R2 Enterpriseを使用):

create table Message
(
ID int Not Null Primary Key,
Text nvarchar(100) not null,
Code nvarchar(50) null
)

Insert Into Message Values (1,'Hello Everybody','T6/45')
Insert Into Message Values (2,'Hello Everybody',Null)
Insert Into Message Values (3,'Hello Everybody','T6/45')
Insert Into Message Values (4,'Hello Everybody','T6/45')
Insert Into Message Values (5,'Hello Everybody','T6/70')
Insert Into Message Values (6,'Hello Everybody','T6/70')
Insert Into Message Values (7,'Hello','T6/70')
Insert Into Message Values (8,'Hello','T6/45')
Insert Into Message Values (9,'Hello Everybody',Null)
Insert Into Message Values (10,'Hello Everybody','T6/70')
Insert Into Message Values (11,'Hello',Null)

Text同じであるが異なるすべてのレコードを取得する必要がありますCode。そして、CodeなりませんNull

したがって、期待される出力は次のようになります。

Insert Into Message Values (1,'Hello Everybody','T6/45')
Insert Into Message Values (5,'Hello Everybody','T6/70')
Insert Into Message Values (7,'Hello','T6/70')
Insert Into Message Values (8,'Hello','T6/45')

以下のクエリを試しましたが、いくつかの行が返されます。

select m1.* 
from Message M1 
With (nolock)
JOIN Message M2 
With (Nolock) 
On m1.Text=m2.Text
where (m1.ID<>m2.ID 
  and m1.Code<>m2.Code 
  and m1.Code is not null)

どうすれば期待どおりの結果を得ることができますか?

また、これはサンプルDBです。約5000万レコードのテーブルでクエリを実行する必要があります。したがって、最適化されたクエリは非常に役立ちます。

4

4 に答える 4

2

これを試して; SQL-FIDDLE-DEMO

;with cte as (
  select id,text,code, row_number() over (partition by text,code order by id) rn
  from message
  where code is not null
)
select id,text,code
from cte 
where rn = 1
order by id
于 2013-02-19T10:12:03.433 に答える
2
SELECT ID,TEXT,CODE
FROM message
WHERE ID IN 
(
  SELECT MIN(ID) FROM message
 WHERE CODE IS NOT NULL GROUP BY TEXT,CODE
)

また

SELECT 
   MIN(ID)
   ,TEXT
   ,CODE 
FROM message
WHERE CODE IS NOT NULL GROUP BY TEXT,CODE
ORDER BY MIN(ID)
于 2013-02-19T10:06:32.480 に答える
1
SELECT DISTINCT m.* 
FROM Message m 
WHERE EXISTS (
  SELECT * 
  FROM Message m1 
  WHERE m1.Id<>m.id 
  AND m1.code<>m.code 
  AND m1.Text=m.Text) 
AND m.Code IS NOT NULL
于 2013-02-19T10:05:33.950 に答える
1
SELECT m.*
FROM message m
WHERE EXISTS (
      SELECT 1
        FROM message m2
       WHERE m2.text = m.text
         AND m2.code = m.code
         AND m2.code IS NOT NULL
    GROUP BY m2.text, m2.code
      HAVING MIN(m2.id) = m.id
      )
于 2013-02-19T09:59:56.500 に答える