根据位置SQL Server重新排序行

时间:2013-06-24 09:05:28

标签: sql sql-server tsql

关于这个问题,我已经看过很多关于SO的问题,但没有一个与我的情景有关。除了做基本的CRUD操作之外,我远不及SQL人。因此我对此非常感兴趣。

我有一张桌子。

myTable [rID, newsID, OrderPosition]其中;

rID is primaryKey int column, 
newsID int is the ID of an item from another table and,
OrderPosition int to hold the position of the rows. 

myTable总共有10行。

所以,最初,我们假设myTable有以下数据:

rID    newsID    OrderPosition
100    4000      1
101    4100      2
102    4200      3
103    4300      4
104    4400      5
105    4500      6
106    4600      7
107    4700      8
108    4800      9
109    4900      10

预期功能应如下;

INSERT NEW

当插入新项目时,用户应该能够将其插入到他/她期望的任何位置。现在,我只是通过删除OrderPosition = 10行,将新记录OrderPosition指定为0并重新排序表,设法将新记录插入第一个位置。但是客户想要选择项目应该去哪个位置。在这种情况下,我假设,OrderPosition = 10将再次被删除?

DELETE

当删除此表中的记录时,由于总共有10条记录,我需要从另一个表[tblNews]获取最新输入的记录并将其插入第10个位置(我可以得到最后一个)记录来自tblNews,按输入日期的顺序排序。)由于我不知道他们将删除哪条记录,我不知道如何在删除记录后重新排序表。

非常感谢任何文章的帮助,代码和方向。

===========编辑====================

答案中提到的UPDATE方法对我来说不起作用; 例如用户想要将新记录插入第5个订单位置。这意味着,订单位置10将被删除,订单位置5,6,7,8和9的当前记录将增加一个

4 个答案:

答案 0 :(得分:4)

这样的事情会对你有用,我想:

CREATE PROC uspMyTableInsert
(
    @newsID INT, @order int
)
AS
BEGIN

    UPDATE MyTable
    SET OrderPosition = OrderPosition + 1
    WHERE OrderPosition >= @Order;

    INSERT INTO MyTable VALUES (@newsID, @order);

    DELETE FROM dbo.myTable WHERE OrderPosition = 11


END

因此,对于插入,您有3个步骤:

首先更新要关注的项目的订单(+1),然后插入您的项目,最后删除第11行。

类似于删除 - 也是3个步骤,但首先删除该行,然后更新以下行的订单(此时为-1),最后只插入新的第10行。

CREATE PROC uspMyTableDelete
(
    @order int
)
AS
BEGIN

    DELETE FROM dbo.myTable WHERE OrderPosition =@order

    UPDATE MyTable
    SET OrderPosition = OrderPosition -1
    WHERE OrderPosition > @Order;

    INSERT INTO MyTable 
    SELECT TOP 1 newsID, 10 
    FROM tblNews ORDER BY newsID DESC


END

<强> SQLFiddle DEMO

答案 1 :(得分:2)

插入行时,您需要“移动”下面的行以腾出空间。例如,插入位置4可以这样做:

DELETE FROM myTable WHERE OrderPosition = 10; -- If you want the keep the table from growing beyond 10 rows.
UPDATE myTable SET OrderPosition = OrderPosition + 1 WHERE OrderPosition >= 4;
INSERT INTO myTable VALUES (..., 4);

相反,删除行后,您可以将行“下方”移回:

DELETE FROM myTable WHERE OrderPosition = 4;
UPDATE myTable SET OrderPosition = OrderPosition - 1 WHERE OrderPosition > 4;
-- Now you can insert the row on position 10 if desired.

请注意,即使OrderPosition对其有UNIQUE约束,UPDATE也不会违反它。

[SQL Fiddle]

答案 2 :(得分:0)

  

插入新项目时,用户应该可以将其插入任何项目   他/她的愿望。现在,我只设法插入新的   通过删除OrderPosition = 10

记录到第一个位置

从数据库返回的数据顺序由sql查询确定 - 我假设您所指的sql查询具有“按OderPosition排序”。

您可以以任何方式插入,更新任何记录。

update mytable set newsID = "newid" where orderposition=10

这没有意义:

  

当删除此表中的记录时,因为总会有一个   共有10条记录

答案 3 :(得分:0)

不确定问题是什么,但会尽力帮助。

首先,如果ColumnPosition只有10个不同的数字,它应该具有唯一的约束(以避免软件错误)。

现在说你要为第五个位置做这个,它必须看起来像: 从myTable中删除ColumnPosition = 5; 插入myTable(newsID,OrderPosition)值(val,5);

这应该在一个事务中发生,它假设你的rID是一个自动递增的ID。