1

ばかげた質問ですが、この質問に対する適切な検索が見つからず、頭が混乱しています。参照テーブルからのキーを持つテーブルがあり、ループを使用して重複することなくレコードを選択することを避けたいと考えています。重複することなく名前を取得できるように、モード 1-5 を参加させる必要があります。明確にするためにコメントを残してください。

Mode(1-5) は ModeID です

例:

参加するテーブル

ID
Mode1
Mode2
Mode3
Mode4
Mode5

参照表

ModeID
ModeName
4

2 に答える 2

6

これはあなたの質問に対する答えです:

SELECT 
    m1.ModeName,
    m2.ModeName,
    m3.ModeName,
    m4.ModeName,
    m5.ModeName
FROM Modes m
LEFT JOIN Ref m1 on m1.ModeID = m.Mode1
LEFT JOIN Ref m2 on m2.ModeID = m.Mode2
LEFT JOIN Ref m3 on m3.ModeID = m.Mode3
LEFT JOIN Ref m4 on m4.ModeID = m.Mode4
LEFT JOIN Ref m5 on m5.ModeID = m.Mode5

しかし、DB の設計に問題があることをお勧めします。結合テーブルを使用する必要があります。

于 2012-11-16T17:14:39.213 に答える
1

ビュー内のテーブルのピボットを解除すると、選択クエリの多くで長期的にテーブルの設計を克服するのに役立つと思います。(特に誰かが 6 番目のモードを追加するという天才的なアイデアを持っている場合:-)

CREATE VIEW UnpivotedTable AS
    SELECT 
        ID, Mode, ModeId 
    FROM 
        TableToJoin
    UNPIVOT (ModeId FOR mode IN (Mode1,Mode2,Mode3,Mode4,Mode5)) AS t
GO

あなたのクエリはかなり「古典的な」 PIVOT クエリになります(しかし、それは私の答えのポイントではありません。非ピボットビューです)

select Id, Mode1, Mode2, Mode3, Mode4, Mode5
from (
    select 
        Id, Mode, ModeName 
    from 
        UnpivotedTable 
            inner join 
        ReferenceTable 
            on ReferenceTable.ModeId = UnpivotedTable.ModeId
        ) as sourcetable
    pivot (
        max(ModeName) 
        for Mode in (Mode1, Mode2, Mode3, Mode4, Mode5)
        ) as pivotTable

これが長期的に役立つことを願っています。返事遅れてすみません

于 2012-11-19T09:27:44.550 に答える