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
然后我希望在选择KeyField2=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