0

大家好,我有这个表结构

 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)

非常感谢。

4

2 回答 2

1

您的帖子似乎不清楚,因为我认为您在描述的某些部分混淆了列名。但是,从您的示例输出来看,我将假设您的意思如下:

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

如果您只需要输出field1and field2,您可以执行以下操作:

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

如果您的表不能DISTINCT包含重复的(field1, field2).

但是,如果表中有更多列并且还需要返回部分或全部列,则可以首先获取上述field1值,然后将该行集合返回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

同样,DISTINCT可以省略,如上所述。

由于您使用的是 SQL Server 2008,因此您也可以使用窗口聚合。如果您的表不包含 的重复项(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每个field1值的最小值和最大值。然后,您将过滤掉f2min与 不同的行f2max,因为这意味着field2组中存在不同的值。

于 2012-06-26T08:00:10.047 回答
0
SELECT * FROM table WHERE field_2 = 1 AND field_1 <> 1
于 2012-06-26T06:09:03.093 回答