Tsql 在T-SQL中显示表的替代解决方案
我有一个简单的employee表,我想按特定顺序显示它。我想知道是否有替代方案(或更好的方案)可以达到同样的效果。T-SQL脚本如下所示:Tsql 在T-SQL中显示表的替代解决方案,tsql,sorting,Tsql,Sorting,我有一个简单的employee表,我想按特定顺序显示它。我想知道是否有替代方案(或更好的方案)可以达到同样的效果。T-SQL脚本如下所示: CREATE TABLE Employee( EmployeeID INT IDENTITY(1,1) NOT NULL, EmployeeName VARCHAR(255) NULL, ManagerID INT NULL, EmployeeType VARCHAR(20) NULL ) GO INSERT INTO Employee (Empl
CREATE TABLE Employee(
EmployeeID INT IDENTITY(1,1) NOT NULL,
EmployeeName VARCHAR(255) NULL,
ManagerID INT NULL,
EmployeeType VARCHAR(20) NULL
)
GO
INSERT INTO Employee (EmployeeName, ManagerID, EmployeeType)
VALUES ('Brad',5,'Memeber');
INSERT INTO Employee (EmployeeName, ManagerID, EmployeeType)
VALUES ('James',3,'Memeber');
INSERT INTO Employee (EmployeeName, ManagerID, EmployeeType)
VALUES ('Ray',null,'Manager');
INSERT INTO Employee (EmployeeName, ManagerID, EmployeeType)
VALUES ('Tom',8,'Memeber');
INSERT INTO Employee (EmployeeName, ManagerID, EmployeeType)
VALUES ('Neil',8,'Memeber');
INSERT INTO Employee (EmployeeName, ManagerID, EmployeeType)
VALUES ('Rob',5,'Memeber');
INSERT INTO Employee (EmployeeName, ManagerID, EmployeeType)
VALUES ('Paul',5,'Memeber');
INSERT INTO Employee (EmployeeName, ManagerID, EmployeeType)
VALUES ('Tim',null,'Manager');
GO
SELECT e.EmployeeType, e.EmployeeName AS [Team Member],
(SELECT e2.EmployeeName FROM Employee AS e2 WHERE e2.EmployeeID = e.ManagerID) AS Manager
FROM Employee AS e
ORDER BY e.EmployeeType, e.EmployeeID
行先由经理排序,然后由employeeID排序。我担心的是,在我的解决方案中,它是按EmployeeType列排序的。改为按ManagerId列对其进行排序是否更好?因为员工类型将来可能会发生变化,比如从经理到团队经理,这可能会导致不同的结果 如果管理者的标准是列
ManangerID为空
,则可以按顺序使用大小写来首先获取管理者
SELECT e.EmployeeType, e.EmployeeName AS [Team Member],
(SELECT e2.EmployeeName FROM Employee AS e2 WHERE e2.EmployeeID = e.ManagerID) AS Manager
FROM Employee AS e
ORDER BY CASE WHEN E.ManagerID IS NULL THEN 0 ELSE 1 END, e.EmployeeID
如果您想根据EmployeeType设置排序,可以这样做
SELECT e.EmployeeType, e.EmployeeName AS [Team Member],
(SELECT e2.EmployeeName FROM Employee AS e2 WHERE e2.EmployeeID = e.ManagerID) AS Manager
FROM Employee AS e
ORDER BY
CASE EmployeeType
WHEN 'Manager' THEN 0
WHEN 'Memeber' THEN 1
ELSE 2
END, e.EmployeeID
或者,您可以使用一个带有EmpType的表来定义排序顺序
CREATE TABLE EmpType(EmployeeType VARCHAR(20) PRIMARY KEY, SortOrder INT)
GO
INSERT INTO EmpType VALUES('Manager', 1)
INSERT INTO EmpType VALUES('Memeber', 2)
SELECT e.EmployeeType, e.EmployeeName AS [Team Member],
(SELECT e2.EmployeeName FROM Employee AS e2 WHERE e2.EmployeeID = e.ManagerID) AS Manager
FROM Employee AS e
LEFT OUTER JOIN EmpType as et
ON e.EmployeeType = et.EmployeeType
ORDER BY et.SortOrder, e.EmployeeID
如果管理者的条件是列
ManangerID为null
,则可以使用排序依据中的大小写首先获取管理者
SELECT e.EmployeeType, e.EmployeeName AS [Team Member],
(SELECT e2.EmployeeName FROM Employee AS e2 WHERE e2.EmployeeID = e.ManagerID) AS Manager
FROM Employee AS e
ORDER BY CASE WHEN E.ManagerID IS NULL THEN 0 ELSE 1 END, e.EmployeeID
如果您想根据EmployeeType设置排序,可以这样做
SELECT e.EmployeeType, e.EmployeeName AS [Team Member],
(SELECT e2.EmployeeName FROM Employee AS e2 WHERE e2.EmployeeID = e.ManagerID) AS Manager
FROM Employee AS e
ORDER BY
CASE EmployeeType
WHEN 'Manager' THEN 0
WHEN 'Memeber' THEN 1
ELSE 2
END, e.EmployeeID
或者,您可以使用一个带有EmpType的表来定义排序顺序
CREATE TABLE EmpType(EmployeeType VARCHAR(20) PRIMARY KEY, SortOrder INT)
GO
INSERT INTO EmpType VALUES('Manager', 1)
INSERT INTO EmpType VALUES('Memeber', 2)
SELECT e.EmployeeType, e.EmployeeName AS [Team Member],
(SELECT e2.EmployeeName FROM Employee AS e2 WHERE e2.EmployeeID = e.ManagerID) AS Manager
FROM Employee AS e
LEFT OUTER JOIN EmpType as et
ON e.EmployeeType = et.EmployeeType
ORDER BY et.SortOrder, e.EmployeeID
没有“通用”的解决方案。在您的示例中,不仅员工类型,而且经理id也可以更改。
若你们需要得到类似的结果,你们应该按照层次结构的级别排序。在这种情况下,首先设置经理,然后设置员工。如果员工将有另一个managerId,它将保持在同一级别。没有“通用”解决方案。在您的示例中,不仅员工类型,而且经理id也可以更改。
若你们需要得到类似的结果,你们应该按照层次结构的级别排序。在这种情况下,首先设置经理,然后设置员工。如果员工将有另一个managerId,则它将保持在同一级别。您需要匹配的业务规则是什么-managerId和employeetype将不同(否则,架构中应该只有一个),因此排序将不同您需要匹配的业务规则是什么-managerId和employeetype将不同(否则,您的架构中应该只有一个)因此排序将有所不同