0

Microsoft SQL Server 2005 を使用しています。

同じ文字列メッセージを持つ列のみを含むテーブルとのクロス結合で、重複する値に関する列を含むテーブルを出力したいと考えています。「文字列メッセージ」を使用したクロス結合が適切な方法であると思います。

次のスクリプトが機能しないのはなぜですか?

DECLARE @IN_CodesTable TABLE
   (
        CodesValues           NVARCHAR(60)
   )
INSERT INTO @IN_CodesTable VALUES('CODE_BB^&')
INSERT INTO @IN_CodesTable VALUES('CODE_1234')
INSERT INTO @IN_CodesTable VALUES('CODE_BB^&')
INSERT INTO @IN_CodesTable VALUES('CODE_$%^&')
INSERT INTO @IN_CodesTable VALUES('CODE_BB^&')
INSERT INTO @IN_CodesTable VALUES('CODE_BB^&')
INSERT INTO @IN_CodesTable VALUES('CODE_1234')

SELECT *
FROM   
(
SELECT DISTINCT CodesTable
FROM @IN_CodesTable
WHERE CodesTable IN
                    ( SELECT  CodesValues
                    FROM     @IN_CodesTable
                    GROUP BY CodesTable
                    HAVING   COUNT(*) > 1
                    )
)
CROSS JOIN
( 
    SELECT 'You have duplicates!' AS DupMessage
)
4

2 に答える 2

2

いくつかの場所では、のCodesTable代わりにを使用していますCodesValues。また、CROSS JOIN動作しますが、次のように、追加の値としてDupMessageを選択する方が少し明確です。

SELECT *, 'You have duplicates!' AS DupMessage
FROM (
    SELECT DISTINCT CodesValues
    FROM IN_CodesTable
    WHERE CodesValues IN (
        SELECT  CodesValues
        FROM IN_CodesTable
        GROUP BY CodesValues
        HAVING COUNT(*) > 1
    )
 ) X

ここにSqlFiddle

于 2012-08-24T13:58:39.423 に答える
1
DECLARE @IN_CodesTable TABLE ( CodesValues NVARCHAR(60) ) 
INSERT INTO @IN_CodesTable VALUES
  ('CODE_BB^&'), ('CODE_1234'), ('CODE_BB^&'), ('CODE_$%^&'),
  ('CODE_BB^&'), ('CODE_BB^&'), ('CODE_1234') 

-- Display only values with duplicate rows.
select distinct CodesValues
  from @IN_CodesTable as CT
  where ( select count(42) from @IN_CodesTable where CodesValues = CT.CodesValues ) > 1

select distinct CodesValues
  from @IN_CodesTable as CT
  group by CodesValues
  having count(42) > 1

-- Display all values with duplicates indicated.
select distinct CodesValues,
  case when ( select count(42) from @IN_CodesTable where CodesValues = CT.CodesValues ) > 1 then 'Duplicates' else '' end as Flag
  from @IN_CodesTable as CT

select distinct CodesValues,
  case when count(42) > 1 then 'Duplicates' else '' end as Flag
  from @IN_CodesTable as CT
  group by CodesValues
于 2012-08-24T14:06:50.730 に答える