取消选择具有不同列值的数据

时间:2012-06-26 05:38:35

标签: sql-server-2008

大家好我有这个表结构

 field 1                  field 2
---------------------------------------------
    1                        1
    1                        2
    2                        1

然后我希望在选择Key Field2 = 1

时这样做
 field 1                  field 2
---------------------------------------------
   2                         1

我不想返回field1 = 1,因为它包含不同的值field1 IN(1,2)

非常感谢你。

2 个答案:

答案 0 :(得分:1)

您的帖子似乎不清楚,因为我认为您在说明的某些部分混淆了列名。但是,根据您的样本输出判断,我将假设您的意思是:

  

从表格中选择field2包含相同field1相同值的行。

如果您只需输出field1field2,则可以执行以下操作:

SELECT field1, MAX(field2) AS field2
FROM atable
GROUP BY field1
HAVING COUNT(DISTINCT field2) = 1

如果您的表格无法容纳DISTINCT的重复对,则可以省略(field1, field2)

但是,如果表中有更多列,并且还需要返回部分或全部列,则可以先获取上述field1值,然后将该行集合加回{{1获取完整的行,如下所示:

atable

同样,SELECT t.* /* or specify the necessary columns explicitly */ FROM atable AS t INNER JOIN ( SELECT field1 FROM atable GROUP BY field1 HAVING COUNT(DISTINCT field2) = 1 ) s ON t.field1 = s.field1 可以省略,如上所述。

由于您使用的是SQL Server 2008,因此您还可以使用窗口聚合。如果您的表格不包含DISTINCT的重复项,则可以使用以下内容:

(field1, field2)

但是如果允许重复,你需要使用稍微不同的方法,因为; WITH counted AS ( SELECT *, cnt = COUNT(*) OVER (PARTITION BY field1) FROM atable ) SELECT field1, field2, … FROM counted WHERE cnt = 1 没有窗口对应物。这是你可以尝试的:

COUNT(DISTINCT …)

也就是说,您为每个; WITH counted AS ( SELECT *, f2min = MIN(field2) OVER (PARTITION BY field1), f2max = MAX(field2) OVER (PARTITION BY field1) FROM atable ) SELECT field1, field2, … FROM minmaxed WHERE f2min = f2max 值获得field2的最小值和最大值。然后,您要过滤掉field1f2min不同的行,因为这意味着该组中存在不同的f2max值。

答案 1 :(得分:0)

SELECT * FROM table WHERE field_2 = 1 AND field_1 <> 1