因此,我知道的SQL足够危险,因此我正在按照一个示例从表中提取一页的记录:
SELECT TOP #arguments.perPage# * FROM (
SELECT DISTINCT ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS rownum, productdiagramparts.productdiagramid AS productdiagramid, products.id AS productid, products.title AS producttitle, totalRows = COUNT(*) OVER()
FROM manufacturers
INNER JOIN products ON manufacturers.id = products.manufacturerid
INNER JOIN productdiagramparts ON products.id = productdiagramparts.productid
INNER JOIN productdiagrams ON productdiagramparts.productdiagramid = productdiagrams.id
WHERE #whereClause#
) _tmpInlineView
WHERE rownum > #offset#
ORDER BY producttitle
当然,围绕该页面的SELECT TOP只会拉出当前页面的记录。问题是,我想删除的最里面的SELECT语句中有重复的语句,但是使用DISTINCT不能像上面所示的那样工作,因为这些行已经为外部查询进行了编号。在对行进行编号之前,如何使最内部的SELECT结果不同?
以下是基于以下公认答案的解决方案:
选择前#个参数。perpage#*从(
选择ROW_NUMBER()OVER(ORDER BY(SELECT 1))作为rownum,productdiagramid,productid,producttitle,totalRows=COUNT(*)OVER()FROM(
选择不同的productdiagramparts.productdiagramid作为productdiagramid,products.ID作为productdiagramid,products.Title作为producttitle从制造商内部连接Productors上的products.ID作为productdiagramparts.productdiagrams.ID,其中#WhereClause#
)_TMPDupRemove
)_TMPInlineView
其中rownum>#offset#ORDER BY producttitle
下面是第二次使用row_number
函数的方法。最内部的select
根据重复项的组分配行号。然后,只返回行号为1的行,以删除重复的行。最后,完成分配行号的过程。
SELECT TOP #arguments.perPage# *
FROM (
SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS rownum,
productdiagramparts.productdiagramid AS productdiagramid,
products.id AS productid, products.title AS producttitle, totalRows = COUNT(*) OVER()
FROM (
SELECT ROW_NUMBER() OVER PARTITION BY productdiagramparts.productdiagramid, products.id ORDER BY (SELECT 1)) AS dup_sequence, *
FROM manufacturers
INNER JOIN products ON manufacturers.id = products.manufacturerid
INNER JOIN productdiagramparts ON products.id = productdiagramparts.productid
INNER JOIN productdiagrams ON productdiagramparts.productdiagramid = productdiagrams.id
WHERE #whereClause#
) _tmpDupRemove
WHERE dup_sequence = 1
) _tmpInlineView
WHERE rownum > #offset#
ORDER BY producttitle
问题内容: 我有一个SQL查询,其结果如下: 现在,我想扩展它,以便大于1的每一行都出现多次。我还需要对这些行进行编号。所以我会得到: 我必须在所有主要数据库(Oracle,SQL Server,MySQL,PostgreSQL,甚至更多)上都可以完成这项工作。因此,一个可以在不同数据库上工作的解决方案将是理想的选择,但是希望能使它在任何数据库上都能工作的聪明方法。 问题答案: 对于MySQL,使
问题内容: 我有一个包含以下字段的表: 现在,我需要删除具有same的行。一种方法是使用以下SQL以及脚本( ): 运行此查询后,我可以使用服务器端脚本删除重复项。 但是,我想知道是否只能使用SQL查询来完成。 问题答案: 一种简单的方法是在3列上添加索引。在编写语句时,请包含关键字。像这样: 这将删除所有重复的行。作为一项额外的好处,重复的将来会出错。和往常一样,您可能需要在运行类似内容之前进行
问题内容: 我有一张看起来像这样的桌子 表格1 ID,名称 如何编写查询以删除所有具有重复名称的行,但保留具有较低ID的行? 问题答案: 如果您使用的是SQL Server 2005或更高版本: 如果使用SQL Server 2000及更低版本
我正在尝试将客户端模型中的contact\u phone列设置为整数数据类型。我仍然希望能够允许用户以他们喜欢的任何格式(即999-999-9999或999.999.9999)输入电话号码,并在将其验证为有效电话号码之前去掉任何非数字字符。 不幸的是,Rails似乎不想让我在验证之前对数据运行gsub,因为它是FixNum数据类型。这是否意味着我必须将其设置为数据库中的字符串,以允许用户在验证之前
问题内容: 我有一个注释表,其结构如下: 我有很多重复的评论,名字和电子邮件都一样。我需要删除它们,有人可以建议我如何使用一个查询来实现此目标吗? 谢谢 问题答案:
问题内容: 我的数据库中有一个表,其中有要删除的重复记录。我不想为此创建具有不同条目的新表。我想要的是从现有表中删除重复的条目,而无需创建任何新表。有什么办法吗? 看到这些都是我的字段: id对于每一行都是唯一的。 L11_data对于相应的动作字段是唯一的。 L11_data具有公司名称,而动作具有行业名称。 因此,在我的数据中,我在L11_data中有各自行业的重复公司名称。 我要拥有的是存储