我正在尝试找出执行一些查找的最干净方法。 我这里有一个充满员工的索引表,然后是一个更大的工单表,它在几个地方使用他们的 EmployeeID - 谁制作了票证,谁上次更新了它,谁关闭了它。 我正在尝试找出最简单的方法,在 SELECT 查询中拉出他们的每个名称,而无需每次都执行一个小的子查询,这就是我现在正在做的事情。
我为自己做了这个小练习,试图简化问题:
CREATE TABLE NameLookup
(
NameIndex INT PRIMARY KEY CLUSTERED IDENTITY(1,1),
Name VARCHAR(10)
);
CREATE UNIQUE NONCLUSTERED INDEX NameIdx ON dbo.NameLookup ([Name])
WITH (IGNORE_DUP_KEY = OFF);
CREATE TABLE BunchaNames
(
PK INT PRIMARY KEY CLUSTERED IDENTITY(1,1),
NameOne INT FOREIGN KEY REFERENCES dbo.NameLookup(NameIndex),
NameTwo INT FOREIGN KEY REFERENCES dbo.NameLookup(NameIndex),
NameThree INT FOREIGN KEY REFERENCES dbo.NameLookup(NameIndex)
);
INSERT INTO NameLookup(Name)
VALUES ('Bill'), ('Phil'), ('Jill'), ('Gil'), ('Fred');
所以现在,我想从BunchaNames中选择NameOne,NameTwo和NameIII,并在NameLookup中显示名称。 最简单/正确的方法是什么? 是这个吗? 非常感谢任何帮助!
SELECT (SELECT Name FROM NameLookup WHERE NameIndex = bn.NameOne) AS NameOne,
(SELECT Name FROM NameLookup WHERE NameIndex = bn.NameTwo) AS NameTwo,
(SELECT Name FROM NameLookup WHERE NameIndex = bn.NameThree) AS NameThree
FROM BunchaNames bn
为什么不使用左连接
select n1.Name as firstName, n2.Name as secondName, n3.Name as thirdName
from BunchaNames as bn
left join NameLookup as n1
on bn.NameOne=n1.nameIndex
left join NameLookup as n2
on bn.NameTwo=n2.nameIndex
left join NameLookup as n3
on bn.NameThree=n3.nameIndex