2012-02-06 3 views
0
create table #customer (
id int not null primary key, 
cust_name varchar(12), 
oldid int null 
) 

insert into #customer values(1,'XYZ',null) 
insert into #customer values(2,'XYZ',1) 
insert into #customer values(3,'XYZ',2) 
insert into #customer values(4,'ABC',null) 
insert into #customer values(5,'ABC',4) 
insert into #customer values(6,'DEF',null) 
insert into #customer values(7,'DEF',6) 
insert into #customer values(8,'DEF',7) 
insert into #customer values(9,'DEF',8) 


select * from #customer 
-- output 

id   cust_name oldid 
----------- ------------ ----------- 
1   XYZ   NULL 
2   XYZ   1 
3   XYZ   2 
4   ABC   NULL 
5   ABC   4 
6   DEF   NULL 
7   DEF   6 
8   DEF   7 
9   DEF   8 

Это симуляция, когда запись возобновляется, в новой записи хранится идентификатор старой записи. Цепь продолжается и опускается до самой первой записи, созданной для этого клиента.вывести значения из таблицы sql

То, что я хочу, я выполняю команду как

выберите * из #customer где ID = 3

Это должно ставить не только запись с идентификатором = 3, но все его старой версии , то есть записи 2 и 1 также.

выберите * из #customer ид = 4

следует тянуть только то, что запись (oldid = нуль)


Enhancement (по желанию): Если кто-то выдает commond

выберите * from #customer, где id = 8

Я хотел бы указать, что для этого клиента существует новая запись. Как я могу это сделать? Предположим, что я собираюсь использовать в приложении ASP.NET.

+0

посмотреть на [это] (http://stackoverflow.com/questions/959804/simulation-of-connect-by-prior-of-oracle-in-sql-server) – StevieG

+0

Я пробовал сам за пару часов. Я знаю, что вам нужно использовать «Common Table Expression», но до сих пор не может быть прав. –

ответ

1

Может получить все старые записи для данного клиента, используя CTE , Что-то вроде

DECLARE @CustomerId int 
SET @CustomerId = 8 

; 
WITH Records (Id, Cust_name, OldId) AS (
    SELECT * FROM #Customer 
    WHERE Id = @CustomerId 
    UNION ALL 
    SELECT C.* FROM Records R 
     INNER JOIN #Customer C on C.Id = R.OldId) 
SELECT * FROM Records 

У вас есть варианты существует ли новая запись, вы можете включить новую запись (ы) в наборе результатов или просто немного флага, но в любом случае запрос будет как

SELECT * FROM #Customer WHERE OldId = @CustomerId 
+0

У меня есть и 1. Можете ли вы дать мне подсказку, как включить последующую запись также в подзапрос, если это возможно. –

+1

Добавьте СОЮЗ ВСЕ между двумя запрошенными мной запросами, которые вернут все старые записи плюс новый, если он существует. – Bort

1

soething, как это должно работать .. (Не имеют доступа к SQLServer сессии на данный момент, чтобы проверить ..)

WITH n(id, cust_name) AS 
    (SELECT id, cust_name 
    FROM customer 
    WHERE id = @id 
     UNION ALL 
    SELECT nplus1.id, nplus1.cust_name 
    FROM emp as nplus1, n 
    WHERE n.empid = nplus1.oldid) 
SELECT * FROM n 
+0

Я сделал работу. Он тянет записи в противоположном направлении по выбору ответа. Я могу использовать его и для чего-то слишком. –

+0

Можете ли вы объяснить 'FROM #customer как nplus1, n WHERE n.id = nplus1.oldid'. На что указывает n? nplus1 указывает на таблицу #customer, которую я знаю. –

+0

Я думаю, что у меня есть это, но это ново для меня. n ссылается на весь запрос как 'with n (...)' еще мне хотелось бы узнать об этом синтаксисе –

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