我正在寻找以下语句的sql语句

时间:2015-02-13 15:23:02

标签: sql oracle duplicates rows

我正在寻找为以下问题编写SQL语句

  1. 删除重复的行
  2. 按列长度选择10到15的行
  3. 它们必须是非特定于SQL Server或Oracle的通用SQL语句。

    有人可以快点帮我吗?

    到目前为止,我尝试了下面的

    假设该表名为sample,其列id intword 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编程新手

    非常感谢你的时间

4 个答案:

答案 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,删除重复行的一般方法如下:

  1. 创建表的副本作为临时表
  2. INSERT in temp table SELECT from base table GROUP BY所有列HAVING COUNT(*)&gt; 1
  3. 使用临时表中的行
  4. 从baseTable删除
  5. 从temp
  6. 中插入基表SELECT

    对于#2,大多数DBMS支持窗口化聚合函数:

    SELECT *
    FROM
     (
       SELECT 
          ROW_NUMBER() OVER (ORDER BY CHAR_LENGTH(word)) AS rn
         ,...
       FROM [SAMPLE]
     ) dt
    WHERE rn BETWEEN 10 AND 15