sql-server 在SQL中,在一列中查找重复项,而在另一列中查找唯一值

yc0p9oo0  于 2022-10-31  发布在  其他
关注(0)|答案(5)|浏览(194)

因此,我有一个与记录ID相关联的别名表。我需要找到具有唯一记录ID的重复别名。为了更好地解释:

ID    Alias     Record ID
1     000123    4
2     000123    4
3     000234    4
4     000123    6
5     000345    6
6     000345    7

对该表的查询结果应该是

000123    4    6
000345    6    7

指示记录4和6都具有别名000123,并且记录6和7都具有别名000345。
我曾考虑过使用GROUP BY,但如果按别名分组,则无法选择记录ID,如果同时按别名和记录ID分组,则只会返回本示例中的前两行,其中两列都是重复的。我找到的唯一解决方案(这是一个使服务器崩溃的糟糕解决方案)是对所有数据执行两次不同的选择,然后将它们连接起来

ON [T_1].[ALIAS] = [T_2].[ALIAS] AND NOT [T_1].[RECORD_ID] = [T_2].[RECORD_ID]

有没有什么解决方案能更好地工作?就像在运行几十万条记录时不会使我的服务器崩溃一样?

zzzyeukh

zzzyeukh1#

看起来你有两个要求:
1.确定具有多个记录ID的所有别名,以及
1.水平列出这些别名的记录ID。
第一种方法比第二种方法简单得多。下面是一些SQL语句,它们应该可以帮助您实现第一种方法:

WITH A   -- Get a list of unique combinations of Alias and [Record ID]
AS  (
   SELECT Distinct
          Alias
     ,    [Record ID]
   FROM  T1
)
,   B  -- Get a list of all those Alias values that have more than one [Record ID] associated
AS  (
    SELECT Alias
    FROM   A
    GROUP BY
           Alias
    HAVING COUNT(*) > 1
)
SELECT  A.Alias
    ,   A.[Record ID]
FROM    A
    JOIN B
        ON  A.Alias = B.Alias

至于第二个问题,如果你对表格中的数据满意:

Alias     Record ID
000123    4
000123    6
000345    6
000345    7

......你可以就此打住。否则,事情就变得棘手了。
PIVOT命令 * 不 * 一定会帮助您,因为它试图解决的问题与您所面临的问题不同。
我假设您不一定能预测每个Alias有多少个重复的Record ID值,因此不知道需要多少列。
如果您只有两个记录,那么在一列中显示每个记录就变得相对简单了。如果您有更多的记录,我建议您考虑一下这些记录的目标(报表、网页、Excel)在水平显示这些记录方面是否比SQL Server在水平返回这些记录方面做得更好。

eqfvzcg8

eqfvzcg82#

也许您需要的只是RecordIdmin()max()

select Alias, min(RecordID), max(RecordId)
from yourTable t
group by Alias
having min(RecordId) <> max(RecordId)

您也可以使用count(distinct)来计算相异值的数目:

select Alias, count(distinct RecordId) as NumRecordIds, min(RecordID), max(RecordId)
from yourTable t
group by Alias
having count(DISTINCT RecordID) > 1;
0s0u357o

0s0u357o3#

这将给予所有重复的值:

select Alias, count(RecordId) as NumRecordIds,  
from yourTable t
group by Alias
having count(RecordId) <> count(distinct RecordId);
qvk1mo1f

qvk1mo1f4#

我同意Ann L的回答,但我想说明一下如何使用CTE的窗口函数,因为您可能更喜欢可读性。
(Re:如何水平地枢转,我再次同意安)
第一个
第一个CTE获取所有唯一别名/记录ID组合。

id | alias  | record_id
----+--------+-----------
  1 | 000123 |         4
  4 | 000123 |         6
  3 | 000234 |         4
  5 | 000345 |         6
  6 | 000345 |         7

第二个CTE只是为上面的别名创建一个新列,并为每个别名添加记录ID的计数。这允许您只筛选那些有多个记录ID与之关联的别名。

id | alias  | record_id | unique_record_ids_count
----+--------+-----------+-------------------------
  1 | 000123 |         4 |                       2
  4 | 000123 |         6 |                       2
  3 | 000234 |         4 |                       1
  5 | 000345 |         6 |                       2
  6 | 000345 |         7 |                       2
8fq7wneg

8fq7wneg5#

SELECT A.CitationId,B.CitationId, A.CitationName, A.LoaderID, A.PrimaryReferenceLoaderID,B.SecondaryReference1LoaderID, A.SecondaryReference1LoaderID, A.SecondaryReference2LoaderID, 
 A.SecondaryReference3LoaderID, A.SecondaryReference4LoaderID, A.CreatedOn, A.LastUpdatedOn 
FROM CitationMaster A, CitationMaster B
WHERE A.PrimaryReferenceLoaderID= B.SecondaryReference1LoaderID and Isnull(A.PrimaryReferenceLoaderID,'') != '' and Isnull(B.SecondaryReference1LoaderID,'') !=''

相关问题