2013-11-14 3 views
-1

Я хочу получить последнего добавленного клиента. У меня нет столбца, в котором хранятся дата/время, в которое была добавлена ​​строка, а мой первичный ключ - Cust_ID, который не является столбцом IDENTITY и не обязательно вводится в порядке возрастания.Определить последнюю строку, добавленную при отсутствии индекса

Это мой стол, Customer, и представьте себе три ряда были добавлены в следующем порядке:

Cust_ID  Cust_Name  Cust_Age 
------------------------------------- 
2    C    23 
6    A    25 
3    B    22 

в приведенном выше примере я хочу, чтобы получить последнюю запись (B). Есть ли какая-либо предопределенная функция в SQL Server, которая вернет последнюю строку таблицы (не полагаясь на порядок возрастания)?

+0

Почему бы вам не добавить временную метку? –

+0

Не существует метода 'Last()' в sql – megawac

+0

Является ли ваш CustID элементом идентификации? –

ответ

3

Вы не можете получить последнюю строку, вставленную до тех пор, пока у вас не будет IDENTITY или DateTime Столбец в вашем столе.

2

либо

  • добавить метку

или

  • добавить автоинкрементного/идентичность ключа
+0

@devek есть какая-либо предопределенная функция в sql-сервере, которая вернет последнюю строку таблицы (без восхождения). –

3

Если у вас нет метаданных, доступных в вашей таблице, и вы не можете редактировать свою схему, чтобы позволить себе время штамп или столбец идентификатора, тогда вы должны полагаться на механизмы генерации метаданных SQL Server. Один - CDC.

CDC означает change data capture, и, как следует из названия, оно поможет вам понять любые изменения, которые были применены к данным. Я думаю, вы можете использовать эти метаданные, чтобы понять, какая последняя запись была вставлена ​​в таблицу.

2

Если вы не можете изменить схему таблицы, то вы можете рассмотреть вопрос о добавлении новой таблицы с той же схеме, что хранит только последняя запись вставляется,

11

Нет, нет предопределенной функции в SQL Server, который будет возвращать «последний строка "таблицы.

По определению таблица представляет собой неупорядоченный набор строк. Представьте, что вы бросаете кучу мрамора в сумку. Теперь откройте сумку и спросите кого-нибудь еще, какой мрамор вышел первым или последним. Теперь бросьте их всех на пол, и когда кто-то еще входит в комнату, спросите их, кто попал в пол первым или последним. Вы не можете этого сделать, потому что нет дополнительной информации, указывающей на порядок, в котором они упали.

То же самое верно для таблицы в SQL Server. Если вы не добавите столбец IDENTITY или столбец datetime или триггер или не используете внешние функции, такие как отслеживание изменений, CDC, аудит и т. Д., SQL Server не сможет сказать вам, какая строка была вставлена ​​последней. Вы можете подумать что просто выбирая из таблицы без заказа по предложению выглядит, как будто он возвращает данные в правильном порядке, это чистое совпадение. Вот пример:

CREATE TABLE dbo.floobat 
(
    ID INT PRIMARY KEY, 
    n VARCHAR(16), 
    x CHAR(4000) NOT NULL DEFAULT '' 
); 

INSERT dbo.floobat(ID,n) VALUES(1,'Sparky'); 
INSERT dbo.floobat(ID,n) VALUES(2,'Aaron'); 
INSERT dbo.floobat(ID,n) VALUES(3,'Norbert'); -- <-- inserted last 

SELECT ID, n FROM dbo.floobat; 

Хорошо, так что по умолчанию это похоже на все.Результаты:

ID n 
-- ------- 
1  Sparky 
2  Aaron 
3  Norbert -- < yes, this is right 

Однако, давайте внести изменения в таблицу, что ваше приложение или что-то еще полагается на выше упорядоченности не будет иметь ни малейшего представления о том:

CREATE NONCLUSTERED INDEX x ON dbo.floobat(n); 

SELECT ID, n FROM dbo.floobat; 

Ой-ой! Результаты:

ID n 
-- ------- 
2  Aaron 
3  Norbert 
1  Sparky -- < oops, this is no longer right 

Вы должны помнить: если вы не включают в себя предложения ORDER BY, вы говорить SQL Server, что вы не заботитесь о порядке. Таким образом, он найдет наиболее эффективный способ вернуть данные, что может привести к различному упорядоченному порядку. Добавление вышеприведенного индекса дало SQL Server лучший путь доступа к извлечению данных. Он все еще использовал сканирование, но этот индекс был более тонким, чем кластеризованный индекс (который мог бы вставлять только две строки на странице).

Даже без индекса вы, вероятно, не получите ожидаемых результатов, так как он запутан тем, что ваш столбец Cust_ID не вставлен в порядке возрастания. Поэтому, если вы вставляете 5 и 2, то выбор без ORDER BY на самом деле приведет к 2, а затем 5 (при условии отсутствия лучшего индекса).

Другие вещи, кроме создания (или отбрасывания, изменения или перестройки), могут привести к тому же изменению поведения заказа. Применить пакет обновления, CU или исправление; очистка кэша процедур; используя различные опции RECOMPILE; обновление статистики; перезапуск сервера; добавление или отключение флага трассировки; изменение параметров опций сервера; перемещение базы данных на другой сервер; и т. д. и т. д.

Итак, если вы хотите отследить эту информацию, вам нужно будет как-то добавить ее в себя, как рассмотрели несколько других ответов.

+0

HI @Aron Bertrand Thanx alot для описания выше о таблице.вы завершили решение моей концепции об этой проблеме. –

+2

отличное объяснение 1 голос вверх – Miller

Смежные вопросы