列n00、n01、n01、...、n99、すべて整数のテーブルTがあります。
このテーブルからすべての行を選択する必要があります。ここで、n00 ... n99の値は各行内で一意です。
列数が少ない場合の例:
columns: n0, n1, n2
row 1: 10, 20, 30
row 2: 34, 45, 56
row 3: 12, 13, 12
row 4: 31, 65, 90
行1、2、4を返すが、3は返さないselectステートメントが必要です(行3には一意でない値12が含まれているため、フィルターで除外します)。
効果的に私はこれを実装する必要があります:
select *
from t
where
n00 <> n01 and n00 <> n02 and ... and n00 <> n99
and n01 <> n02 and n01 <> n03 and ... and n01 <> n99
and n02 <> n03 and n02 <> n04 and ... and n02 <> n99
...
and n97 <> n98 and n97 <> n99
and n98 <> n99
...しかし、「よりスマートな」WHEREブロックを使用します。
ヒントは大歓迎です。
UNPIVOTも使用できます。
DECLARE @t TABLE(n0 int, n1 int, n2 int);
INSERT INTO @t VALUES (10, 20, 30), (34, 45, 56), (12, 13, 12), (31, 65, 90);
WITH cteRows AS(
SELECT ROW_NUMBER() OVER (ORDER BY n0, n1, n2) rn, *
FROM @t
),
cteUP AS(
SELECT rn, rn_val
FROM cteRows
UNPIVOT(
rn_val FOR rn_vals IN(n0, n1, n2)
) up
),
cteFilter AS(
SELECT rn, rn_val, count(*) anz
FROM cteUP
GROUP BY rn, rn_val
HAVING count(*) > 1
)
SELECT *
FROM cteRows
WHERE rn NOT IN (SELECT rn FROM cteFilter)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加