大家好我有这个表结构
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)
非常感谢你。
答案 0 :(得分:1)
您的帖子似乎不清楚,因为我认为您在说明的某些部分混淆了列名。但是,根据您的样本输出判断,我将假设您的意思是:
从表格中选择
field2
包含相同field1
相同值的行。
如果您只需输出field1
和field2
,则可以执行以下操作:
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
的最小值和最大值。然后,您要过滤掉field1
与f2min
不同的行,因为这意味着该组中存在不同的f2max
值。
答案 1 :(得分:0)
SELECT * FROM table WHERE field_2 = 1 AND field_1 <> 1