sql名称相同但值不同
如何检索具有相同名称但具有不同值的所有行?例如,我有以下表格:sql名称相同但值不同,sql,sql-server,Sql,Sql Server,如何检索具有相同名称但具有不同值的所有行?例如,我有以下表格: Name|Value|Description Rob |Val1 |Text1 Alex|Val1 |Text2 Alan|Val2 |Text3 Alex|Val2 |Text4 Alex|Val2 |Text5 Alan|Val2 |Text6 我希望查询只返回多次出现但具有不同值的人员。因此,结果将是: Alex|Val1 |Text2 Alex|Val2 |Text4 Alex|Val2 |Text5 编辑:我在
Name|Value|Description
Rob |Val1 |Text1
Alex|Val1 |Text2
Alan|Val2 |Text3
Alex|Val2 |Text4
Alex|Val2 |Text5
Alan|Val2 |Text6
我希望查询只返回多次出现但具有不同值的人员。因此,结果将是:
Alex|Val1 |Text2
Alex|Val2 |Text4
Alex|Val2 |Text5
编辑:我在初始表中添加了另一行。一些任务也会将艾伦作为结果的一部分返回。我不想这样,因为很明显它有相同的价值。如何实现这一点?尝试使用join和sybquery,并具有:
或exists子句中的同一子查询:
演示
更新问题的解决方案
select *
from Persons c
where name in
(
select Name from(
select Name,Value
from persons
group by Name,Value) T
group by Name
having count(1)>1
)
演示以下是一个简单的工作解决方案:
SELECT t.Name, t.Value, t.Description
FROM t_table AS t
JOIN (
SELECT Name
FROM (
SELECT Name FROM t_table GROUP BY Name,Value
) AS sub1
GROUP BY Name
HAVING COUNT(*)>1
) AS sub2 ON (t.Name=sub2.Name)
ORDER BY t.Name, t.Value
你可以这样做 从表1中选择*作为WHERE 1=CASE WHEN 从表1中选择COUNT*作为B,其中B.NAME=A.NAME >1,然后1,否则0结束 只是为了好玩。。。 交叉连接可能会像我没有测试过的那样工作:
select distinct
p1.*
from
Persons p1
cross join
Persons p2
where
p1.Name = p2.Name
and p1.Value <> p2.value
and p1.Description <> p2.Description
现在你可以开始讨论这将有多有效。。。
但我不会参与其中 您的SQL风格是什么?您编辑了表。因此,还要编辑所需的输出:不,结果很好。我不希望它为Alan返回任何信息,因为它具有相同的值。我希望所有的人都有相同的名字,但没有相同的值。@RoxanaDinca,所以你不想按描述过滤。正确吗?@RoxanaDinca有什么问题吗?您第一次使用group by Name、Value查询将返回错误的结果。它将按名称+值的重复数复制每一行。@Skrol29您看到sql FIDLE了吗?对我来说,没有复制品。这是第一个问题的解决方案。您的第一个SQL FIDLE do返回Alan记录,这是一个错误。另一个SQL FIDLE显示了SQL中的重复错误:@Skrol29在示例中没有行“Alex”、“Val1”、“Text7”;。如果没有这一点,它可以正确地处理第一个问题。问题是找不到返回与示例相同结果的任意查询。它还可以解决任何示例中的明确问题。您的查询返回Alex和Alan,但她说我不希望它返回Alan的任何信息是的,它只适用于'Alex'、'Val1'、'Text7'或更多,但如果没有仅来自示例的行,它不会返回任何行。查询不适用于任何情况。如果Name+Value+Description不是表中的主键,那么查询可能会返回重复的结果以及简化的结果。这是因为该查询假定名称+值+描述是标识每条记录的唯一组合。@Skrol29能否提供一个示例?您将在原始表中插入哪一行以使其不起作用?抱歉,我不明白,在您的示例中,丢失的行是什么?您可以看到插入了4条记录,查询只给出了3条记录。
SELECT t.Name, t.Value, t.Description
FROM t_table AS t
JOIN (
SELECT Name
FROM (
SELECT Name FROM t_table GROUP BY Name,Value
) AS sub1
GROUP BY Name
HAVING COUNT(*)>1
) AS sub2 ON (t.Name=sub2.Name)
ORDER BY t.Name, t.Value
select distinct
p1.*
from
Persons p1
cross join
Persons p2
where
p1.Name = p2.Name
and p1.Value <> p2.value
and p1.Description <> p2.Description