2016-09-15 78 views
2

我在SQL Server有一个表像下面改变至少一次:检索行时一列的值的另一列值

DECLARE @tbl TABLE (val1 VARCHAR(10), val2 VARCHAR(10)) 

INSERT INTO @tbl 
VALUES ('x', 'a'), ('x', 'a'), ('p', 'b'), ('y', 'a'), ('p', 'b'); 

val1 | val2 
------+------- 
x  | a 
x  | a 
p  | b 
y  | a 
p  | b 

结果应该是的(的val2)将行仅作为价值val1中的至少一次变为y。但val2.b的行应该在结果中被忽略,因为它在val1中的值不会改变。

val1 | val2 
------+------ 
x  | a 
x  | a 
y  | a 

回答

2

试试这个,

select t.* 
from @tbl t 
INNER JOIN ( select t2.val2 
       from @tbl t2 
       group by t2.val2 
       having min(t2.val1) <> max(t2.val1) 
      ) AS tt ON tt.val2 = t.val2 
1

这是做你想做的吗?

select t.* 
from @tbl t 
where t.val2 = (select t2.val2 
       from @tbl t2 
       group by t2.val2 
       having min(t2.val1) <> max(t2.val1) 
       ); 
+0

它返回所有的行。 – bill

+0

将min(t2.val1)<> max(t2.val2)更改为min(t2.val1)<> max(t2.val1)和= to in工作。 – bill

+0

@bill。 。 。是的,那是对的。这是一个错字。 –

1
SELECT 
    * 
FROM @tbl 
WHERE val2 IN 
(
    SELECT 
     Z.val2 
    FROM 
    (
     SELECT 
      *,ROW_NUMBER() OVER(Partition BY val2 Order BY Val2) AS PartNo 
     FROM  
     (
      SELECT 
       * 
      FROM @tbl 
      GROUP BY val1,val2 
     )X 
    )Z WHERE Z.PartNo>1 
) 
2

我终于结束了使用类似下面。

SELECT t.* 
FROM @tbl t 
WHERE EXISTS (
    SELECT t2.val2 
    FROM @tbl t2 
    WHERE t.val2 = t2.val2 
    GROUP BY t2.val2 
    HAVING min(t2.val1) <> max(t2.val1) 
    ) 
相关问题