0

いくつかのルックアップを実行する最もクリーンな方法を見つけようとしています。ここには従業員でいっぱいのインデックス テーブルがあり、複数の場所で従業員 ID を使用するより大きなチケット テーブルがあります。毎回小さなサブクエリを実行せずに、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、および NameThree を選択し、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
4

1 に答える 1

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
于 2012-05-23T19:33:35.133 に答える