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 回答