Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 取消选择具有不同列值的数据_Sql Server 2008 - Fatal编程技术网

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

Sql server 2008 取消选择具有不同列值的数据,sql-server-2008,Sql Server 2008,嗨,伙计们,我有这个桌子结构 field 1 field 2 --------------------------------------------- 1 1 1 2 2 1 然后我希望在选择KeyField2=1时是这样的 field 1 field 2 --

嗨,伙计们,我有这个桌子结构

 field 1                  field 2
---------------------------------------------
    1                        1
    1                        2
    2                        1
然后我希望在选择Key
Field2=1时是这样的

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

非常感谢。

从表中选择*字段,其中字段_2=1和字段_1 1
SELECT * FROM table WHERE field_2 = 1 AND field_1 <> 1

你的文章似乎不清楚,因为我认为你在描述的某些部分混淆了列名。但是,根据您的示例输出判断,我将假设您的意思如下:

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

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

SELECT field1, MAX(field2) AS field2
FROM atable
GROUP BY field1
HAVING COUNT(DISTINCT field2) = 1
;
WITH counted AS (
  SELECT
    *,
    cnt = COUNT(*) OVER (PARTITION BY field1)
  FROM atable
)
SELECT
  field1,
  field2,
  …
FROM counted
WHERE cnt = 1
如果您的表不能容纳重复的
(field1,field2)
,则可以省略
DISTINCT

但是,如果表中有更多的列,并且其中的一些或所有列也需要返回,您可以首先像上面那样获取
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)
,则可以使用以下选项:

SELECT field1, MAX(field2) AS field2
FROM atable
GROUP BY field1
HAVING COUNT(DISTINCT field2) = 1
;
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

也就是说,对于每个
field1
值,您将获得
field2
的最小值和最大值。然后,您将筛选出
f2min
f2max
不同的行,因为这意味着组中有不同的
field2
值。

从表中选择field_1、field_2,其中field_2=1和field_1!=1