Sql server 列中每个值的倒数

Sql server 列中每个值的倒数,sql-server,tsql,Sql Server,Tsql,假设我有一个行数为偶数的表。对于eg-具有两列名称和EmpCode的表Employee。这张桌子看起来像 Name EmpCode Ajay 7 Vikash 5 Shalu 4 Hari 8 Anu 1 Puja 9 现在,我希望我的输出与EMP代码相反,如: Name EmpCode Ajay 9 Vikash 1 Sh

假设我有一个行数为偶数的表。对于eg-具有两列名称和EmpCode的表Employee。这张桌子看起来像

Name          EmpCode
Ajay          7
Vikash        5
Shalu         4
Hari          8
Anu           1
Puja          9
现在,我希望我的输出与EMP代码相反,如:

Name          EmpCode
Ajay          9
Vikash        1
Shalu         8
Hari          4
Anu           5
Puja          7

我需要在SQL Server中运行此查询。

由于OP没有回复,我将发布一些解释。正如每个人都回避的那样,SQL Server中的表没有内置的顺序。您的数据存储在所谓的堆中。这意味着,当您运行查询时,如果没有排序依据,您的数据可以按照服务器感觉的任何顺序返回。对于小数据集,这可能是您插入它的顺序,但这只是它(可能)

当您访问更大的数据集,并且在操作上运行多个核心时,则
SELECT*FROM[Table]
很可能不是插入顺序,并且很可能是随机的,每个运行查询的实例都是随机的。我有几个表,其中一个
selecttop1*..
将在每次运行查询时返回不同的行;即使使用
聚集索引

唯一一种保证订单的方法是使用
orderby
。现在,您可能有另一个您没有共享的专栏,您可以通过它来订购,但如果没有,这个(非常)简单的示例至少会对您有所帮助,如果没有其他帮助的话:

CREATE TABLE #Employee ([Name] varchar(10), EmpCode tinyint);

INSERT INTO #Employee
VALUES ('Ajay',7),
       ('Vikash',5),
       ('Shalu',4),
       ('Hari',8),
       ('Anu',1),
       ('Puja',9);
GO
--Just SELECT *. ORDER is NOT guaranteed, but, due to the low volume of data, will probably be in the order by insertion
SELECT *
FROM #Employee;

--But, we want to reverse the order, so, let's add an ORDER BY
SELECT *
FROM #Employee
ORDER BY [Name];

--Oh! That didn't work (duh). Let's try again
SELECT *
FROM #Employee
ORDER BY Empcode;

--Nope, this isn't working. That's because your data has nothing related to it's insertion order. So, let's give it one:
GO
DROP TABLE #Employee;

CREATE TABLE #Employee (ID int IDENTITY(1,1), --Oooo, what is this?
                        [Name] varchar(10),
                        EmpCode tinyint);

INSERT INTO #Employee
VALUES ('Ajay',7),
       ('Vikash',5),
       ('Shalu',4),
       ('Hari',8),
       ('Anu',1),
       ('Puja',9);
GO
--Now look
SELECT *
FROM #Employee;

--So, we can use an ORDER BY, and get the correct order too
SELECT [Name],
       Empcode
FROM #Employee
ORDER BY ID;

--So, we got the right ORDER using an ORDER BY. Now we can do something about the ordering:
--We'll need a CTE for this:
WITH RNs AS(
    SELECT *,
           ROW_NUMBER() OVER (ORDER BY ID ASC) AS RN1,
           ROW_NUMBER() OVER (ORDER BY ID DESC) AS RN2
    FROM #Employee)
SELECT R1.[Name],
       R2.EmpCode
FROM RNs R1
     JOIN RNs R2 ON R1.RN1 = R2.RN2;

GO
DROP TABLE #Employee;

由于OP还没有回复,我将为他们发布一些解释。正如每个人都回避的那样,SQL Server中的表没有内置的顺序。您的数据存储在所谓的堆中。这意味着,当您运行查询时,如果没有排序依据,您的数据可以按照服务器感觉的任何
顺序返回。对于小数据集,这可能是您插入它的顺序,但这只是它(可能)

当您访问更大的数据集,并且在操作上运行多个核心时,则
SELECT*FROM[Table]
很可能不是插入顺序,并且很可能是随机的,每个运行查询的实例都是随机的。我有几个表,其中一个
selecttop1*..
将在每次运行查询时返回不同的行;即使使用
聚集索引

唯一一种保证订单的方法是使用
orderby
。现在,您可能有另一个您没有共享的专栏,您可以通过它来订购,但如果没有,这个(非常)简单的示例至少会对您有所帮助,如果没有其他帮助的话:

CREATE TABLE #Employee ([Name] varchar(10), EmpCode tinyint);

INSERT INTO #Employee
VALUES ('Ajay',7),
       ('Vikash',5),
       ('Shalu',4),
       ('Hari',8),
       ('Anu',1),
       ('Puja',9);
GO
--Just SELECT *. ORDER is NOT guaranteed, but, due to the low volume of data, will probably be in the order by insertion
SELECT *
FROM #Employee;

--But, we want to reverse the order, so, let's add an ORDER BY
SELECT *
FROM #Employee
ORDER BY [Name];

--Oh! That didn't work (duh). Let's try again
SELECT *
FROM #Employee
ORDER BY Empcode;

--Nope, this isn't working. That's because your data has nothing related to it's insertion order. So, let's give it one:
GO
DROP TABLE #Employee;

CREATE TABLE #Employee (ID int IDENTITY(1,1), --Oooo, what is this?
                        [Name] varchar(10),
                        EmpCode tinyint);

INSERT INTO #Employee
VALUES ('Ajay',7),
       ('Vikash',5),
       ('Shalu',4),
       ('Hari',8),
       ('Anu',1),
       ('Puja',9);
GO
--Now look
SELECT *
FROM #Employee;

--So, we can use an ORDER BY, and get the correct order too
SELECT [Name],
       Empcode
FROM #Employee
ORDER BY ID;

--So, we got the right ORDER using an ORDER BY. Now we can do something about the ordering:
--We'll need a CTE for this:
WITH RNs AS(
    SELECT *,
           ROW_NUMBER() OVER (ORDER BY ID ASC) AS RN1,
           ROW_NUMBER() OVER (ORDER BY ID DESC) AS RN2
    FROM #Employee)
SELECT R1.[Name],
       R2.EmpCode
FROM RNs R1
     JOIN RNs R2 ON R1.RN1 = R2.RN2;

GO
DROP TABLE #Employee;

是什么决定了员工当前的顺序?@RameshRajendran Empcode 7位于第一个数据集的开头,第二个数据集的结尾。相反,EMP代码9位于第一个代码的末尾,第二个代码的开头。数据的顺序是相反的。然而,问题是,我看不到任何方法可以实现OP对其供应数据的订单。
ORDER BY[Name]
ORDER BY EmpCode
都不提供初始顺序。表没有自然顺序。没有order by的select可以是任意顺序。您的表中是否有任何id或主键(int)列。如果数据中没有定义顺序,这是不可能的。是什么决定了员工当前的顺序?@RameshRajendran Empcode 7位于第一个数据集的开头,第二个数据集的结尾。相反,EMP代码9位于第一个代码的末尾,第二个代码的开头。数据的顺序是相反的。然而,问题是,我看不到任何方法可以实现OP对其供应数据的订单。
ORDER BY[Name]
ORDER BY EmpCode
都不提供初始顺序。表没有自然顺序。没有order by的select可以是任意顺序。您的表中是否有任何id或主键(int)列。如果数据中没有定义顺序,这是不可能的。虽然您的答案是正确的,但您的代码示例表明您误解了问题。OP没有询问如何以相反的顺序返回行,而是询问如何以相反的顺序返回
empcode
,同时保持
名称的顺序与第一次查询相同。我没有注意到这一部分,谢谢@ZoharPeled。我要做一个修改。现在你在说:-)+1。虽然你的答案是正确的,但你的代码示例表明你误解了这个问题。OP没有询问如何以相反的顺序返回行,而是询问如何以相反的顺序返回
empcode
,同时保持
名称的顺序与第一次查询相同。我没有注意到这一部分,谢谢@ZoharPeled。我要做一个修正。现在你在说:-)+1。