2012-05-23 7 views
0

Я пытаюсь найти самый чистый способ выполнить некоторые поиски. У меня есть таблица с индексами, заполненная здесь сотрудниками, а затем большая таблица билетов, в которой используются свои сотрудники EmployeeID в нескольких местах - кто сделал билет, который последний раз его обновил, и кто его закрыл. Я пытаюсь выяснить самый простой способ вытащить каждое из своих имен в запросе SELECT, не делая каждый раз каждый раз небольшой подзапрос, что я и делаю прямо сейчас.TSQL Самый простой способ выполнить этот крошечный запрос 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'); 

Так что теперь, я хочу выбрать NameOne, NameTwo и NameThree из BunchaNames и отображения имен в 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 
+0

Поскольку не существует никакого отношения б/ш 'namelookup' и' bunchanames' ... ваш запрос выглядит правильно для меня. – Rahul

ответ

2

Почему бы не использовать левый присоединяется

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 
+0

Спасибо, Кира! Это имеет большой смысл. – Skkra

+0

Рад, что я мог помочь. :) – Kyra

Смежные вопросы