Выбрать все строки из SQL на основе существования нескольких строк (порядковых номеров) - PullRequest
2 голосов
/ 14 октября 2010

Допустим, у меня есть данные таблицы, подобные следующим:

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

То, что я пытаюсь сделать, это только изолировать записи для Джейн Доу, основываясь на том факте, что у нее более одной строки в этой таблице. (Более одного порядкового номера) Я не могу выделить на основе идентификатора, имен, цветов, лет и т. Д. Число 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 ]

4 голосов
/ 14 октября 2010

Во-первых, чтобы найти идентификаторы для записей с несколькими строками, которые вы бы использовали:

 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)

Если выЗнайте, что второй идентификатор последовательности всегда будет равен «2» и что запись «2» никогда не будет удалена, вы можете найти что-то вроде:

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

, чтобы быть быстрее, но вам лучше убедиться, что требованиягарантированно встретятся в вашей базе данных (и вы хотите, чтобы составной индекс был (SequenceID, ID)).

2 голосов
/ 14 октября 2010

Попробуйте что-то вроде следующего. Это одно сканирование таблицы, в отличие от 2, как и другие.

SELECT * FROM (
    SELECT t1.*, COUNT(name) OVER (PARTITION BY name) mycount FROM TABLE t1
)
WHERE mycount >1;
0 голосов
/ 14 октября 2010

ВНУТРЕННЕЕ СОЕДИНЕНИЕ

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
0 голосов
/ 14 октября 2010

Ознакомьтесь с предложением HAVING для сводного запроса. Вы можете указать такие вещи, как

  HAVING COUNT(*) >= 2 

и пр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...