3

そのため、レコード 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 の両方でグループ化すると、この例では両方の列が重複している最初の 2 行のみが返されます。私が見つけた唯一の解決策は、私のサーバーをクラッシュさせたひどいものです。すべてのデータに対して2つの異なる選択を行い、それらを結合することです

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

よりうまく機能する解決策はありますか?たとえば、数十万件のレコードで実行するとサーバーがクラッシュしませんか?

4

3 に答える 3

11

次の 2 つの要件があるようです。

  1. 複数のレコード ID を持つすべてのエイリアスを特定し、
  2. これらのエイリアスのレコード ID を横方向にリストします。

1 つ目は 2 つ目よりもはるかに簡単です。以下は、最初の SQL で必要な場所に到達するはずの 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

さて、2番目について。この形式のデータに満足している場合:

Alias     Record ID
000123    4
000123    6
000345    6
000345    7

...そこで止められます。そうしないと、事態はややこしくなります。

PIVOT コマンドは、あなたが抱えている問題とは異なる問題を解決しようとしているため、必ずしも役に立ちません

Record IDごとに重複する値がいくつあるかを必ずしも予測できるとは限らないため、必要なAlias列の数がわからないと想定しています。2 つしかない場合、それぞれを列に表示するのは比較的簡単な作業になります。それ以上ある場合は、これらのレコードの宛先 (レポート? Web ページ? Excel?) が、SQL Server がそれらを並べて返すよりも、横方向に表示する方が優れているかどうかを検討することをお勧めします。水平に。

于 2013-07-08T22:39:21.857 に答える
0

This will give all repeated values:

select Alias, count(RecordId) as NumRecordIds,  
from yourTable t
group by Alias
having count(RecordId) <> count(distinct RecordId);
于 2015-06-16T10:13:26.900 に答える
0

おそらく、あなたが望むのは のmin()andだけmax()ですRecordId:

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;
于 2013-07-08T23:00:58.807 に答える