(SQL)如何在单独列出行的同时查询共享属性的项目列表?
这里有一点“特别”的时刻。基本上,我有一个DB表,用于列出文件及其属性(大小、创建日期等)。作为一个自称的(近乎妄想的)SQL高手,你可以想象当我无法找到一种高质量的方式来单独列出[INSERT ATTRIBUTE HERE]出现多次的文件时,我会感到惊讶 例如,假设我想查看其文件大小(或创建日期)在表中多次出现的所有文件,但我仍然希望它们单独列出。或者是一个更好的应用程序:一组共享MD5哈希值的文件,但只有那些多次出现的文件(即重复文件),我仍然希望单独列出每个文件。显然,我可以多次遍历数据库,但我对单个查询感兴趣。有什么想法吗 最好的 [编辑#1(计数错误)](SQL)如何在单独列出行的同时查询共享属性的项目列表?,sql,database,file,md5,duplicate-data,Sql,Database,File,Md5,Duplicate Data,这里有一点“特别”的时刻。基本上,我有一个DB表,用于列出文件及其属性(大小、创建日期等)。作为一个自称的(近乎妄想的)SQL高手,你可以想象当我无法找到一种高质量的方式来单独列出[INSERT ATTRIBUTE HERE]出现多次的文件时,我会感到惊讶 例如,假设我想查看其文件大小(或创建日期)在表中多次出现的所有文件,但我仍然希望它们单独列出。或者是一个更好的应用程序:一组共享MD5哈希值的文件,但只有那些多次出现的文件(即重复文件),我仍然希望单独列出每个文件。显然,我可以多次遍历数据库
如果我理解正确,使用Sql Server您可以尝试以下操作
DECLARE @Table TABLE(
ID INT IDENTITY(1,1),
FullFileName VARCHAR(500),
DateCreated DATETIME,
FileSize INT
)
INSERT INTO @Table (FullFileName, DateCreated, FileSize)
SELECT 'a','01 Jan 2000',10
INSERT INTO @Table (FullFileName, DateCreated, FileSize)
SELECT 'b','02 Jan 2000',1000
INSERT INTO @Table (FullFileName, DateCreated, FileSize)
SELECT 'c','01 Jan 2000',100
INSERT INTO @Table (FullFileName, DateCreated, FileSize)
SELECT 'd','03 Jan 2000',10
SELECT t.*
FROM @Table t INNER JOIN
(
SELECT FileSize
FROm @Table
GROUP BY FileSize
HAVING COUNT(ID) > 1
) FileSizes ON t.FileSize = FileSizes.FileSize
我会让COUNT(someField)>1。下面是一个使用文件名的示例,但是您当然可以为MD5或datetime字段修改它
declare @foo table (FileNameOnDisk varchar(100), MD5Hash varchar(100), CreatedOn smalldatetime)
INSERT Into @foo (FileNameOnDisk, MD5Hash, CreatedOn)
VALUES ('foo', 'abc123', 'jan 1 2010'),
('bar', 'abc123', 'aug 1 2010'),
('ar', 'ajkfsd43', 'nov 1 2010'),
('baz', '44', 'sep 1 2010'),
('foo', 'abc123', 'aug 1 2010'),
('baz', '44', 'jan 1 2010')
select *
from @foo where FileNameOnDisk in (
select FileNameOnDisk from @foo
group by FileNameOnDisk
having COUNT(FileNameOnDisk) > 1
)order by FileNameOnDisk
哦!我确实有过,但我的问题是在第二部分中查询计数:[见编辑#1]…有时我的大脑会像那样打嗝,我想我实际上必须在查询中包含计数,以便以后处理它。不要问。。。。谢谢你们两个!
declare @foo table (FileNameOnDisk varchar(100), MD5Hash varchar(100), CreatedOn smalldatetime)
INSERT Into @foo (FileNameOnDisk, MD5Hash, CreatedOn)
VALUES ('foo', 'abc123', 'jan 1 2010'),
('bar', 'abc123', 'aug 1 2010'),
('ar', 'ajkfsd43', 'nov 1 2010'),
('baz', '44', 'sep 1 2010'),
('foo', 'abc123', 'aug 1 2010'),
('baz', '44', 'jan 1 2010')
select *
from @foo where FileNameOnDisk in (
select FileNameOnDisk from @foo
group by FileNameOnDisk
having COUNT(FileNameOnDisk) > 1
)order by FileNameOnDisk