2

同じレコードに2つの異なるIDが割り当てられているとします。例えば

RecordID | ID1 | ID2
--------------------
1 | X | A
2 | X | B
3 | Y | C
4 | Y | C
5 | Y | D
6 | Z | E
7 | Z | E

ID1ここで、同じ値に割り当てられているレコードと、別の値に割り当てられているレコードを取得したいと思いID2ます。

たとえば、私は取得したい:

1, X, A
2, X, B

ここで、ID1はそれにXを割り当てましたが、ID2はそれにAとBを割り当て、2つの異なる値を割り当てました。

そのようなレコードを返すSQLまたはSQLサーバーでクエリを作成することは可能ですか?

4

4 に答える 4

1

サブクエリを使用する必要があります。ここでは、行ごとにテーブルを調べて、他の行がそれに関連する特定の基準に一致するかどうかを確認します。

疑似SQL:

select 
      t1.id, 
      t1.variable, 
      t1.value 
   from 
      table t1 
   where 
      exists ( select 1 
                  from t2 
                  where t2.id != t1.id 
                    and t2.variable == t1.variable 
                    and t2.value != t1.value)
于 2013-02-06T21:33:33.147 に答える
1

私があなたの要件を理解していると仮定すると、あなたが必要とするのはINNER JOIN

SELECT DISTINCT T.*
FROM YourTable T
  JOIN YourTable T2 ON T.ID1 = T2.ID1 AND T.ID2 <> T2.ID2

そして、これがSQLFiddleです。

この例では、XとYからすべての行を返すことに注意してください。AとBのため、X。YはCとDのためです。これは正しいですか?

幸運を。

于 2013-02-06T21:45:18.313 に答える
1

私はあなたがこれを探していると思います:

SELECT RecordID, ID1, ID2
FROM yourtable
WHERE ID1 IN (SELECT ID1
              FROM yourtable
              GROUP BY ID1
              HAVING COUNT(DISTINCT ID2)>1);

ここでフィドルを参照してください。

于 2013-02-06T21:47:11.847 に答える
1

これがSQLServer2005以降の場合:

WITH minmax AS (
  SELECT
    *,
    minID2 = MIN(ID2) OVER (PARTITION BY ID1),
    maxID2 = MAX(ID2) OVER (PARTITION BY ID1)
  FROM atable
)
SELECT
  RecordID,
  ID1,
  ID2
FROM minmax
WHERE minID2 <> maxID2
;

CTEでは、同じ。を持つ行のすべてのグループに対してminmax最小値と最大値を保持する2つの列が追加されます。メインクエリは、対応する最小値が最大値と一致しない行のみを返します。ID2ID1ID2ID2

于 2013-02-06T22:58:09.550 に答える