2

假设我为同一记录分配了两个不同的 ID。例如

记录ID | ID1 | ID2
--------------------
1 | X | 一个
2 | X | 乙
3 | 是 | C
4 | 是 | C
5 | 是 | D
6 | Z | 乙
7 | Z | 乙

现在,我想获取ID1分配给相同值的记录,其中ID2分配给不同的值。

例如,我想得到:

1, X, A
2, X, B

这里 ID1 分配了 X,而 ID2 分配了 A 和 B,这是两个不同的值。

是否可以在 SQL 或 SQL 服务器中编写一个返回此类记录的查询?

4

4 回答 4

1

如果这是 SQL Server 2005+:

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
;

minmaxCTE 中,添加了另外两列,它们ID2为每组具有相同ID1. ID2主查询仅返回相应最小值与最大值不匹配的那些行ID2

于 2013-02-06T22:58:09.550 回答
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

我想你正在寻找这个:

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

假设我了解您的要求,我认为您所需要的只是INNER JOIN

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

这是SQL Fiddle

请注意,在此示例中,它返回 X 和 Y 中的所有行。X 因为 A 和 B;Y 因为 C 和 D。这是正确的吗?

祝你好运。

于 2013-02-06T21:45:18.313 回答