任何人都可以解释如何从表中获取不同的记录。

时间:2013-11-19 13:27:46

标签: sql oracle

如何从表中获取不同的记录?

有人向我建议这个问题:

select * from emp a 
where rowid = (select max(rowid) from emp b 
               where a.empno=b.empno);

插入的每一行rowid是唯一的吗?使用max(rowid)有什么用?

为什么我不能使用以下查询?

select distinct sal, distinct empno from emp;

4 个答案:

答案 0 :(得分:2)

ROWID是独一无二的。

当条件找到多行(duplciate)时使用MAX(ROWID),然后在此处记录最新的(排序后的最后一条记录)。

  

First Query是根据不同的值从表中选择所有行   一栏。

     

第二个查询是选择一个具有自己的列   清晰度。

这两个查询都会让您与众不同。但等待select distinct sal, distinct empno from emp;错误,应为select distinct sal, empno from emp;

考虑以下

--
-- DATASET  (Table)
--

CREATE TABLE DATASET ( VAL1 CHAR ( 1 CHAR ),
                        VAL2 VARCHAR2 ( 10 CHAR ),
                        VAL3 NUMBER );

INSERT INTO
      DATASET ( VAL1, VAL2, VAL3 )
VALUES
      ( 'b', 'b-details', 2 );

INSERT INTO
      DATASET ( VAL1, VAL2, VAL3 )
VALUES
      ( 'a', 'a-details', 1 );

INSERT INTO
      DATASET ( VAL1, VAL2, VAL3 )
VALUES
      ( 'c', 'c-details', 3 );

INSERT INTO
      DATASET ( VAL1, VAL2, VAL3 )
VALUES
      ( 'a', 'dup', 4 );

COMMIT;

现在是您的第一个查询

SELECT
      *
FROM
      DATASET A
WHERE
      ROWID = (SELECT
                   MAX ( ROWID )
             FROM
                   DATASET B
             WHERE
                   A.VAL1 = B.VAL1);


VAL1 VAL2             VAL3
---- ---------- ----------
b    b-details           2
a    as                  4
c    c-details           3

3 rows selected.

PS:我选择了一列(VAL1)上具有不同条件的所有列(VAL1,VAL2,VAL3),因此重复项按其他列排序,因此您会看到一行。< / p>

现在第二次查询

SELECT DISTINCT VAl1 FROM DATASET;


VAL1
----
b   
a   
c   

3 rows selected.

PS:这里我选择一个不同的列(VAL1)

答案 1 :(得分:1)

  1. rowid对每一行都是唯一的,建议的请求将为每个empno插入最后一条记录

  2. 不要重复DISTINCT,以下SQL请求将返回所有不同的sal,empno

    select distinct sal, empno from emp;
    

答案 2 :(得分:0)

您可以使用group by获取不同的记录。

从emp中选择sal,empno Sal,empno的小组;

答案 3 :(得分:0)

delete from emp a where rowid != (select max(rowid) from emp b where  a.empno=b.empno);