根据多行(序列号)的存在从SQL中选择所有行

时间:2010-10-13 20:49:07

标签: oracle function count rows

假设我的表数据类似于以下内容:

123456 John  Doe 1  Green  2001
234567 Jane  Doe 1  Yellow 2001
234567 Jane  Doe 2  Red    2001
345678 Jim   Doe 1  Red    2001

我试图做的只是根据Jane Doe的记录,根据她在这个表中有多行的事实。 (更多一个序列号) 我无法根据ID,名称,颜色,年份等进行隔离... 序列中的数字1告诉我这是第一条记录,我需要能够显示该记录,以及第2条记录 - 更改记录。

如果表名为users,则字段名为ID,fname,lname,seq_no,color,date。如何编写代码以仅选择此表中包含多行的记录?例如:

我希望查询仅根据多行的存在来显示:

234567 Jane  Doe 1  Yellow 2001
234567 Jane  Doe 2  Red    2001

在PL / SQL

4 个答案:

答案 0 :(得分:4)

首先,要查找具有多行的记录的ID:

 SELECT ID FROM table GROUP BY ID HAVING COUNT(*) > 1

所以你可以用

获得所有人的所有记录
 SELECT * FROM table WHERE ID IN (SELECT ID FROM table GROUP BY ID HAVING COUNT(*) > 1)

如果您知道第二个序列ID将始终为“2”并且永远不会删除“2”记录,您可能会发现如下内容:

 SELECT * FROM table WHERE ID IN (SELECT ID FROM table WHERE SequenceID = 2)

要快一些,但最好确保在数据库中保证满足要​​求(并且你需要一个复合索引(SequenceID,ID))。

答案 1 :(得分:2)

尝试以下内容。这是一个表格扫描,而不是像其他人一样。

SELECT * FROM (
    SELECT t1.*, COUNT(name) OVER (PARTITION BY name) mycount FROM TABLE t1
)
WHERE mycount >1;

答案 2 :(得分:0)

查看HAVING子句以获取摘要查询。你可以指定像

这样的东西
  HAVING COUNT(*) >= 2 

等等。

答案 3 :(得分:0)

INNER JOIN

JOIN:

SELECT u1.ID, u1.fname, u1.lname, u1.seq_no, u1.color, u1.date
FROM users u1 JOIN users u2 ON (u1.ID = u2.ID and u2.seq_no = 2) 

其中:

SELECT u1.ID, u1.fname, u1.lname, u1.seq_no, u1.color, u1.date
FROM users u1, thetable u2 
WHERE 
    u1.ID = u2.ID AND
    u2.seq_no = 2
相关问题