[SQL] 인덱스가 존재하지 않을 때 추가 최신 행 결정 [중복]
SQL인덱스가 존재하지 않을 때 추가 최신 행 결정 [중복]
나는 가장 최근에 추가 된 고객을 검색합니다. 나는 행이 추가 된 날짜 / 시간을 저장하는 열이없는, 나의 기본 키가 IDENTITY 열이 아닌 반드시 오름차순으로 입력되지 않는, CUST_ID이다.
이것은 내 테이블, 고객, 그리고 상상 세 개의 행이 순서로 추가되었습니다
Cust_ID Cust_Name Cust_Age
-------------------------------------
2 C 23
6 A 25
3 B 22
위의 예에서 나는 마지막 레코드 (B)를 싶어. (오름차순에 의존하지 않고) 테이블의 마지막 행을 반환합니다 SQL Server의 미리 정의 된 기능이 있습니까?
해결법
-
==============================
1.아니, 테이블의 "마지막 행"을 반환합니다 SQL Server의 미리 정의 된 기능이 없습니다.
아니, 테이블의 "마지막 행"을 반환합니다 SQL Server의 미리 정의 된 기능이 없습니다.
정의에 의하면, 테이블의 행 순서화 된 집합이다. 당신이 가방에 구슬을 잔뜩 던져 상상 해보세요. 이제 가방을 열고 대리석 첫 번째 또는 마지막에 가서 다른 사람을 부탁드립니다. 이제 바닥에 그들 모두를 던져, 그리고 다른 사람이 방에 올 때, 첫 번째 또는 마지막 바닥에 충돌하는 요청합니다. 가 하락하는 순서에 대해 아무것도 나타내는 추가 정보가 더 있기 때문에 당신은 그것을 할 수 없습니다.
동일은 SQL Server에서 테이블에 대한 사실이다. 당신이 IDENTITY 열, 또는 날짜 열 또는 트리거를 추가하거나 등 변경 추적, CDC, 감사와 같은 외부 기능을 사용하지 않는 한, SQL 서버가 마지막으로 삽입 된 행 말할 수있는 방법이 없습니다. 당신은 올바른 순서로 데이터를 반환하는 것처럼,이 순수한 우연이 절 외모로 주문하지 않고 테이블에서 해당 단지 선택을 생각할 수 있습니다. 다음은 그 예이다 :
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 서버에게 데이터를 검색에 더 나은 액세스 경로를 준 이상 추가. 아직 스캔을 사용하지만, 그 인덱스는 (만 페이지에 두 행에 맞게 수) 클러스터 된 인덱스보다 방법 삐쩍이었다.
그것은 당신의 CUST_ID 열이 오름차순으로 삽입되지 않는 사실에 의해 뒤얽힌 때문에 심지어 인덱스없이, 당신은 아마, 당신이 기대하는 결과를 얻을 수 없다. 그래서 경우 2 ~ 5 삽입보다, 주문 BY없이 선택하면 실제로 (더 좋은 인덱스가 존재하지 않는 가정)이 다음 5가 발생합니다.
인덱스를 생성 (또는 삭제하거나, 변경 또는 재건) 이외의 다른 것들은 주문 행동의 변화 같은 종류의 원인이 될 수 있습니다. 서비스 팩, CU 또는 핫픽스를 적용; 프로 시저 캐시를 플러시; 다양한 RECOMPILE 옵션을 사용하여; 통계를 갱신하는 단계; 서버를 다시 시작; 추가하거나 추적 플래그를 해제; 서버 옵션 옵션을 변경; 다른 서버로 데이터베이스를 이동; 등 등
이 정보를 추적 할 경우에 따라서, 당신이 언급 한 다른 답변의 몇 가지로, 어떤 방법으로 스스로를 추가해야합니다.
-
==============================
2.당신도 IDENTITY 또는 테이블에 날짜 시간 열이 없다면 당신은 전까지 마지막 행 삽입을 얻을 수 없습니다.
당신도 IDENTITY 또는 테이블에 날짜 시간 열이 없다면 당신은 전까지 마지막 행 삽입을 얻을 수 없습니다.
-
==============================
3.당신이 당신의 테이블에 메타 데이터를 사용할 수 있고, 당신이 타임 스탬프 또는 ID 열 중 하나를 감당할 수있는 스키마를 편집 할 수없는 경우에, 당신은 SQL 서버의 메타 데이터 생성 메커니즘에 의존해야한다. 하나는 CDC이다.
당신이 당신의 테이블에 메타 데이터를 사용할 수 있고, 당신이 타임 스탬프 또는 ID 열 중 하나를 감당할 수있는 스키마를 편집 할 수없는 경우에, 당신은 SQL 서버의 메타 데이터 생성 메커니즘에 의존해야한다. 하나는 CDC이다.
CDC는 변경 데이터 캡처를 의미하고, 이름의 의미, 그것은 당신이 데이터에 적용된 변화를 이해하는 데 도움이있다. 난 당신이 테이블에 삽입 된 최신 기록이 무엇인지 이해하고,이 메타 데이터를 사용할 수 있다고 생각합니다.
-
==============================
4.어느 한 쪽
어느 한 쪽
또는
-
==============================
5.당신이 당신의 테이블 스키마를 변경하지 못할 경우에 당신이 저장 마지막 레코드가 삽입 된 것을 동일한 스키마에 새 테이블을 추가하는 것을 고려 할 수있다,
당신이 당신의 테이블 스키마를 변경하지 못할 경우에 당신이 저장 마지막 레코드가 삽입 된 것을 동일한 스키마에 새 테이블을 추가하는 것을 고려 할 수있다,
from https://stackoverflow.com/questions/19982804/determine-latest-row-added-when-no-index-is-present by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 명성에 기반 권한 구현 [폐쇄] (0) | 2020.07.20 |
---|---|
[SQL] 어떻게 널 (null)을 허용하지 않는 PostgreSQL 데이터베이스에 열을 추가 할 수 있습니까? (0) | 2020.07.20 |
[SQL] 조건과 고유 한 카운트 (0) | 2020.07.20 |
[SQL] GRANT 모든 저장 프로 시저 실행을 (0) | 2020.07.20 |
[SQL] 나는 다른 데이터베이스 테이블에 하나의 데이터베이스와 삽입에서 포함 된 테이블을 복사하려면 (0) | 2020.07.20 |