我正在为以下语句寻找 sql 语句
I am looking for sql statements for below statements
我正在寻找为以下问题编写 SQL 语句
- 删除重复行
- 至 select 行从 10 到 15 按列长度排序
它们需要是通用的 SQL 语句,而不是特定于 SQL Server 或 Oracle。
任何人都可以快速帮助我吗?
到目前为止,我尝试了以下
假设 table 被称为 sample
,列 id int
,并且 word varchar(50)
查询 #1:
delete from [sample] a
where a.rowid > any (select b.rowid
from [SAMPLE] b
where a.word = b.word)
查询#2:
SELECT *
FROM [SAMPLE]
WHERE rownum <= 5 AND rowid NOT IN (SELECT ROWID
FROM [sample]
ORDER BY LENGTH(WORD)
WHERE rownum >= 10);
他们正确吗?我是 SQL 编程新手
非常感谢您的宝贵时间
对于行号,如果您有一个可排序的键(一个唯一的列或一组列),您可以这样做:
Select (Select count(*) from table
Where keyColumn <= thisRow.KeyColumn) rowNum
From table thisRow
Order by keyColumn
它很贵,但它很普通。
要删除重复的行,可以使用类似的方法:
Delete From table
Where keyColumn Not in
(Select Max(KeyColumn) -- or Min(KeyColumn)
From table
Group By [All Columns other than KeyColumn]
having count(*) > 1)
去除重复的方法有很多。这个效果不错。
delete from sample a
where a.rowid not in (select min(b.rowid)
from sample b
group by word)
对于#1,删除重复行的通用方法如下:
- 创建 table 的副本作为临时 table
- INSERT in temp table SELECT from base table GROUP BY 所有列 HAVING COUNT(*) > 1
- 使用临时文件中的行从 baseTable 中删除 table
- INSERT in base table SELECT from temp
对于 #2 大多数 DBMS 支持窗口聚合函数:
SELECT *
FROM
(
SELECT
ROW_NUMBER() OVER (ORDER BY CHAR_LENGTH(word)) AS rn
,...
FROM [SAMPLE]
) dt
WHERE rn BETWEEN 10 AND 15
(1) 您的查询非常接近。在 Oracle 中:
delete from sample s
where s.rowid > (select min(s2.rowid) from sample s2 where s.word = s2.word)
SQL 服务器没有 rowid
伪列。如果您有一个唯一的 ID,则以下内容将适用于两个数据库:
delete from sample s
where s.id > (select min(s2.id) from sample s2 where s.word = s2.word)
(2) SQL Server 和 Oracle 的最新版本均支持 ANSI 标准 FETCH
语法。所以,像这样:
select t.*
from table t
order by length(t.col)
offset 10 fetch next 6 rows;
问题是 length()
与 len()
函数。这些在两个数据库中是不同的。最好的办法是在其中一个数据库中创建一个用户定义的函数来模仿另一个数据库的功能。
我正在寻找为以下问题编写 SQL 语句
- 删除重复行
- 至 select 行从 10 到 15 按列长度排序
它们需要是通用的 SQL 语句,而不是特定于 SQL Server 或 Oracle。
任何人都可以快速帮助我吗?
到目前为止,我尝试了以下
假设 table 被称为 sample
,列 id int
,并且 word varchar(50)
查询 #1:
delete from [sample] a
where a.rowid > any (select b.rowid
from [SAMPLE] b
where a.word = b.word)
查询#2:
SELECT *
FROM [SAMPLE]
WHERE rownum <= 5 AND rowid NOT IN (SELECT ROWID
FROM [sample]
ORDER BY LENGTH(WORD)
WHERE rownum >= 10);
他们正确吗?我是 SQL 编程新手
非常感谢您的宝贵时间
对于行号,如果您有一个可排序的键(一个唯一的列或一组列),您可以这样做:
Select (Select count(*) from table
Where keyColumn <= thisRow.KeyColumn) rowNum
From table thisRow
Order by keyColumn
它很贵,但它很普通。
要删除重复的行,可以使用类似的方法:
Delete From table
Where keyColumn Not in
(Select Max(KeyColumn) -- or Min(KeyColumn)
From table
Group By [All Columns other than KeyColumn]
having count(*) > 1)
去除重复的方法有很多。这个效果不错。
delete from sample a
where a.rowid not in (select min(b.rowid)
from sample b
group by word)
对于#1,删除重复行的通用方法如下:
- 创建 table 的副本作为临时 table
- INSERT in temp table SELECT from base table GROUP BY 所有列 HAVING COUNT(*) > 1
- 使用临时文件中的行从 baseTable 中删除 table
- INSERT in base table SELECT from temp
对于 #2 大多数 DBMS 支持窗口聚合函数:
SELECT *
FROM
(
SELECT
ROW_NUMBER() OVER (ORDER BY CHAR_LENGTH(word)) AS rn
,...
FROM [SAMPLE]
) dt
WHERE rn BETWEEN 10 AND 15
(1) 您的查询非常接近。在 Oracle 中:
delete from sample s
where s.rowid > (select min(s2.rowid) from sample s2 where s.word = s2.word)
SQL 服务器没有 rowid
伪列。如果您有一个唯一的 ID,则以下内容将适用于两个数据库:
delete from sample s
where s.id > (select min(s2.id) from sample s2 where s.word = s2.word)
(2) SQL Server 和 Oracle 的最新版本均支持 ANSI 标准 FETCH
语法。所以,像这样:
select t.*
from table t
order by length(t.col)
offset 10 fetch next 6 rows;
问题是 length()
与 len()
函数。这些在两个数据库中是不同的。最好的办法是在其中一个数据库中创建一个用户定义的函数来模仿另一个数据库的功能。