Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
Home
Discussion Groups
DB Engine
SQL ServerMSDESQL Server CE
Services
Analysis (Data Mining)Analysis (OLAP)DTSIntegration ServicesNotification ServicesReporting Services
Programming
CLRConnectivitySQLXML
Other Technologies
ClusteringEnglish QueryFull-Text SearchReplicationService Broker
General
Data WarehousingPerformanceSecuritySetupSQL Server ToolsOther SQL Server Topics
DirectoryUser Groups
Related Topics
MS AccessOther DB ProductsMS Server Products.NET DevelopmentVB DevelopmentJava DevelopmentMore Topics ...

SQL Server Forum / General / Other SQL Server Topics / May 2007

Tip: Looking for answers? Try searching our database.

sorting table while inserting

Thread view: 
Enable EMail Alerts  Start New Thread
Thread rating: 
Oonz - 29 May 2007 17:04 GMT
Hi Friends,

How can we insert records in sorted order

like consider a table

No Name Phone
1    test1    12345
1    test1    23455
2    test2    68638
3    test3    67684
4    test4    54808
4    test4    74594

if i add a new record like this

2   test2    34454

it should go in specific order. so that the final table should look
something like this

No Name Phone
1    test1    12345
1    test1    23455
2    test2    34454
2    test2    68638
3    test3    67684
4    test4    54808
4    test4    74594
Jason Lepack - 29 May 2007 17:19 GMT
Tables don't store data in a logical order.  They store data in a
physical order.  If you want to see data in an ordered fashion then
create a view to do that.  Also, Name is a reserved word, don't use
it...

SELECT
 No,
 NameField,
 Phone
FROM
 yourTable
ORDER BY
 No, NameField, Phone

Cheers,
Jason Lepack
> Hi Friends,
>
[quoted text clipped - 25 lines]
> 4    test4      54808
> 4    test4      74594
Oonz - 29 May 2007 17:24 GMT
> Tables don't store data in a logical order.  They store data in a
> physical order.  If you want to see data in an ordered fashion then
[quoted text clipped - 44 lines]
>
> - Show quoted text -

But actually i want to do further processing with that sorted table.
Thats why i am in need of such structure

Thanks
Arunkumar.D
Jason Lepack - 29 May 2007 17:27 GMT
What exactly do you want to do?  Maybe there is a better way of doing
it that you haven't come across.

Give a little more detail and more help can be given.

Cheers,
Jason Lepack

> > Tables don't store data in a logical order.  They store data in a
> > physical order.  If you want to see data in an ordered fashion then
[quoted text clipped - 52 lines]
>
> - Show quoted text -
Ed Murphy - 29 May 2007 17:41 GMT
> What exactly do you want to do?  Maybe there is a better way of doing
> it that you haven't come across.

More specifically, it sounds like he (like many others) is stuck on
procedural rather than functional thinking.  Beware the frumious CURSOR!

> Give a little more detail and more help can be given.

Agreed.
Oonz - 29 May 2007 17:42 GMT
> What exactly do you want to do?  Maybe there is a better way of doing
> it that you haven't come across.
[quoted text clipped - 62 lines]
>
> - Show quoted text -

Actually i will combine the multiple numbers into one single record

the temporary table structure would be like this

No Name Phone   FinalPhone
1    test1    12345  12345
1    test1    23455  12345<br> 23455
2    test2    68638  68638
2    test2    34454  68638<br> 34454<br>
2    test2   45445  68638<br> 34454<br> 45445
3    test3    67684  67684
4    test4    54808  54808
4    test4    74594  54808<br> 74594

and by using GROUP BY clause i would select single record having all
the
information

No   Name    FinalPhone
1     test1     12345<br> 23455
2     test2     68638<br> 34454<br> 45445
3     test3     67684
4     test4     54808<br> 74594

this view would be sent to UI for display...

Thanks
Arunkumar.D
Ed Murphy - 29 May 2007 18:51 GMT
> Actually i will combine the multiple numbers into one single record
>
[quoted text clipped - 9 lines]
> 4    test4    54808  54808
> 4    test4    74594  54808<br> 74594

Add a DateInserted column, and use it in sorting.

If you delete the row with Phone = 34454, do you want to have to also
update the row with 45445 so that FinalPhone = 68638<br>45445?  Of
course not - that would be a maintenance nightmare.  Move FinalPhone
from the database to the UI layer, or at least from the table to a view.
Jason Lepack - 29 May 2007 19:01 GMT
I created two tables and a trigger and I have all the functionality
that you wanted, without having to create a cursor.  The key is to let
the database do the work and this way, any record that validly gets
inserted into the phone_numbers table automatically gets put into the
phone_output list.

If you expect to be deleting or modifying records from the
phone_numbers table then you will need to add update and delete
triggers.  (Note: for delete, use the replace function)

If you need more help, just post back.

Cheers,
Jason Lepack

Try this:

-- Begin SQL
CREATE TABLE [dbo].[phone_numbers](
    [num] [int] NOT NULL,
    [phone_name] [varchar](50) NOT NULL,
    [phone] [varchar](50) NOT NULL
) ON [PRIMARY]
GO

CREATE UNIQUE NONCLUSTERED INDEX [nat_key] ON [dbo].[phone_numbers]
(
    [num] ASC,
    [phone] ASC
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[phone_output](
    [num] [int] NOT NULL,
    [phone_name] [nvarchar](50) NOT NULL,
    [final_phone] [varchar](max) NULL
) ON [PRIMARY]
GO

CREATE TRIGGER [dbo].[update_final_phone]
  ON  dbo.phone_numbers
  AFTER INSERT
AS
BEGIN
    insert into
        phone_output(num, phone_name)
    select distinct
        i.num,
        i.phone_name
    from
        inserted i
        left outer join phone_output p
            on i.num = p.num
    where
        p.num is null

    update
        phone_output
    set
        final_phone = coalesce(final_phone + '<br>','') + phone
    from
        inserted i
    where
        phone_output.num = i.num
END
GO

insert into phone_numbers (num,phone_name,phone) values
(1,'test1','12345')
insert into phone_numbers (num,phone_name,phone) values
(1,'test1','23455')
insert into phone_numbers (num,phone_name,phone) values
(2,'test2','68638')
insert into phone_numbers (num,phone_name,phone) values
(3,'test3','67684')
insert into phone_numbers (num,phone_name,phone) values
(4,'test4','54808')
insert into phone_numbers (num,phone_name,phone) values
(4,'test4','74594')
go

select * from phone_numbers
select * from phone_output
-- End SQL

> > What exactly do you want to do?  Maybe there is a better way of doing
> > it that you haven't come across.
[quoted text clipped - 93 lines]
>
> - Show quoted text -
Jason Lepack - 30 May 2007 14:33 GMT
I created delete and update triggers... here's the complete ddl.

CREATE TABLE [dbo].[phone_numbers](
       [num] [int] NOT NULL,
       [phone_name] [varchar](50) NOT NULL,
       [phone] [varchar](50) NOT NULL
) ON [PRIMARY]
GO

CREATE UNIQUE NONCLUSTERED INDEX [nat_key] ON [dbo].[phone_numbers]
(
       [num] ASC,
       [phone] ASC
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[phone_output](
       [num] [int] NOT NULL,
       [phone_name] [nvarchar](50) NOT NULL,
       [final_phone] [varchar](max) NULL
) ON [PRIMARY]
GO

CREATE TRIGGER [dbo].[insert_final_phone]
  ON  dbo.phone_numbers
  AFTER INSERT
AS
BEGIN
       insert into
               phone_output(num, phone_name)
       select distinct
               i.num,
               i.phone_name
       from
               inserted i
               left outer join phone_output p
                       on i.num = p.num
       where
               p.num is null

       update
               phone_output
       set
               final_phone = coalesce(final_phone + '<br>','') +
phone
       from
               inserted i
       where
               phone_output.num = i.num
END
GO

CREATE TRIGGER [dbo].[delete_final_phone]
  ON  dbo.phone_numbers
  AFTER DELETE
AS
BEGIN
       update
               phone_output
       set
               final_phone = replace(final_phone, d.phone+'<br>', '')
       from
               deleted d
       where
               phone_output.num = d.num

        update
               phone_output
       set
               final_phone = replace(final_phone, d.phone, '')
       from
               deleted d
       where
               phone_output.num = d.num

        delete phone_output
       where final_phone = ''
END
GO

CREATE TRIGGER [dbo].[update_final_phone]
  ON  dbo.phone_numbers
  AFTER UPDATE
AS
BEGIN
       update
               phone_output
       set
               final_phone = replace(final_phone, d.phone+'<br>', '')
       from
               deleted d
       where
               phone_output.num = d.num

        update
               phone_output
       set
               final_phone = replace(final_phone, d.phone, '')
       from
               deleted d
       where
               phone_output.num = d.num

        delete phone_output
       where final_phone = ''

        insert into
               phone_output(num, phone_name)
       select distinct
               i.num,
               i.phone_name
       from
               inserted i
               left outer join phone_output p
                       on i.num = p.num
       where
               p.num is null

       update
               phone_output
       set
               final_phone = coalesce(final_phone + '<br>','') +
phone
       from
               inserted i
       where
               phone_output.num = i.num
END
GO

insert into phone_numbers (num,phone_name,phone) values
(1,'test1','12345')
insert into phone_numbers (num,phone_name,phone) values
(1,'test1','23455')
insert into phone_numbers (num,phone_name,phone) values
(1,'test1','68638')
insert into phone_numbers (num,phone_name,phone) values
(3,'test3','67684')
insert into phone_numbers (num,phone_name,phone) values
(4,'test4','54808')
insert into phone_numbers (num,phone_name,phone) values
(4,'test4','74594')
go

delete phone_numbers where num = 1 and phone = '23455'
delete phone_numbers where num = 3
go

update phone_numbers set num = 2 where phone = '54808'
update phone_numbers set phone = '7686' where phone = '12345'
go

> I created two tables and a trigger and I have all the functionality
> that you wanted, without having to create a cursor.  The key is to let
[quoted text clipped - 180 lines]
>
> - Show quoted text -
Erland Sommarskog - 29 May 2007 22:26 GMT
> Actually i will combine the multiple numbers into one single record
>
[quoted text clipped - 20 lines]
>
> this view would be sent to UI for display...

GROUP BY is not your guy, in this case. See this link for some ideas on
to produce concatenated lists:
http://www.projectdmx.com/tsql/rowconcatenate.aspx

Signature

Erland Sommarskog, SQL Server MVP, esquel@sommarskog.se

Books Online for SQL Server 2005 at
http://www.microsoft.com/technet/prodtechnol/sql/2005/downloads/books.mspx
Books Online for SQL Server 2000 at
http://www.microsoft.com/sql/prodinfo/previousversions/books.mspx

 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2009 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.