如果我有一张表如下:
ID | 名称| 类别| 家长| 网址| 最后修改
如果两行具有相同的Name和parent,则它们不是唯一的.在这种情况下,如何获得唯一的行集(但返回的列数多于使它们唯一的列)?
因此,有关详细信息:这是一个公司关键字表,其中关键字按类别进行组织.每个关键字只能有一个类别.每个关键字都可以有子关键字,因此如果parent = 0或NULL,则它是一个root关键字.如果关键字在类别中具有相同的名称和父级,则它们不是唯一的(无论其他列如何).如果两个关键字具有相同的名称和类别,并且parent = 0或NULL,则它们不是唯一的.如果有重复,那么我只想要第一个.原因是我将这些放入一个不允许关键字有两个具有相同名称的子系统的系统中.
我还想看看哪些行重复,看看是什么导致我的麻烦!
到目前为止,感谢一百万人的出色回应.我显然不是一个SQL人...... :(
这取决于您对非唯一行的操作.如果您不想在结果集中使用它们,您可以使用group by并具有:
select Name, Parent, Max(Category)
from Table
group by Name, Parent
having count(*) = 1
Run Code Online (Sandbox Code Playgroud)
您需要Max(类别),因为您没有按该列进行分组,即使每个Name和Parent只有一行.
但是,如果要在结果中包含非唯一行,则类似于:
select distinct Name, Parent, Category from Table
Run Code Online (Sandbox Code Playgroud)
除了具有相同Name和Parent但不同Category的两行只返回一行.在这种情况下,您需要确定要为Category显示的内容,因为多行会被压缩为一行.您仍然可以使用Max(类别)或Min(类别)和分组,但不要使用.
select Name, Parent, Max(Category)
from Table
group by Name, Parent
Run Code Online (Sandbox Code Playgroud)
此查询查找没有其他行具有相同名称和父级的所有行。如果两行的父行设置为 NULL,则这些行不被视为具有相同的父行。
SELECT T1.*
FROM Table1 T1
LEFT JOIN Table1 T2
ON T1.ID != T2.ID AND T1.Name = T2.Name AND T1.Parent = T2.Parent
WHERE T2.ID IS NULL
Run Code Online (Sandbox Code Playgroud)