我正在寻找为以下问题编写SQL语句
它们必须是非特定于SQL Server或Oracle的通用SQL语句。
有人可以快点帮我吗?
到目前为止,我尝试了下面的
假设该表名为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编程新手
非常感谢你的时间
答案 0 :(得分:2)
(1)您的查询非常接近。在Oracle中:
delete from sample s
where s.rowid > (select min(s2.rowid) from sample s2 where s.word = s2.word)
SQL Server没有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()
功能。这两个数据库有所不同。您最好的选择是在其中一个数据库中创建一个用户定义的函数来模仿另一个数据库的功能。
答案 1 :(得分:0)
对于行号,如果您有可排序的键,(一个唯一的列或一组列),您可以这样做:
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)
答案 2 :(得分:0)
要删除重复项,有很多方法。这个很好用。
delete from sample a
where a.rowid not in (select min(b.rowid)
from sample b
group by word)
答案 3 :(得分:0)
对于#1,删除重复行的一般方法如下:
对于#2,大多数DBMS支持窗口化聚合函数:
SELECT *
FROM
(
SELECT
ROW_NUMBER() OVER (ORDER BY CHAR_LENGTH(word)) AS rn
,...
FROM [SAMPLE]
) dt
WHERE rn BETWEEN 10 AND 15