2017-10-17 21 views
0

内部で3つの異なるIDと別のIDのIDを持つテーブルを結合するクエリを作成する必要があります。クエリを選択します。私はそれをもう少し明確にしようとします。私の一つのテーブルで複数のID列を複数の名前列に表示するために、外部テーブル内のIDを持つ複数のID列を結合する

私は、IDのとこれらの3列があります。

Book_Sommerhuse.[BS_ID] 

Book_Kalender.BS_ID, 
Book_Kalender.BS_ID_Prio2, 
Book_Kalender.BS_ID_Prio3, 

は、これらのすべては、これらのIDに関連付けられた名前が含まれている別のテーブルの列、と結合インナーする必要があります

SELECTクエリでは、外部テーブルの名前列を含めています。代わりに3つの列があり、それぞれにIDに対応する名前が関連付けられています。私の選択クエリから

INNER JOIN Book_Kalender ON Book_Sommerhuse.[BS_ID] = Book_Kalender.[BS_ID] 
AND Book_Sommerhuse.[BS_ID] = Book_Kalender.[BS_ID_Prio2] 

しかし、この戻り、空のビュー:

Book_Sommerhuse.BS_Navn 

は、これまでのところ私は、複数の内部は、ANDキーワードを使用して加入させることを試みました。また、IDに関連付けられた名前ごとに新しい列を作成する方法もわかりません。

全クエリ:

SELECT 
    Book_Kalender.BK_ID, 
    Book_Kalender.BK_DatoFra, 
    Book_Kalender.BK_DatoTil, 
    Book_Kalender.BK_M_Navn, 
    Book_Kalender.BK_M_Adr, 
    Book_Kalender.BK_M_PostBy, 
    Book_Kalender.BK_M_Afd, 
    Book_Kalender.BK_M_MedArbNr, 
    Book_Kalender.BK_M_Tlf, 
    Book_Kalender.BK_M_Email, 
    Book_Kalender.BK_Tidl_Lejet, 
    Book_Kalender.BK_Tidl_Lejet_Txt, 
    Book_Kalender.BS_ID, 
    Book_Kalender.BS_ID_Prio2, 
    Book_Kalender.BS_ID_Prio3,  
    A.BS_Navn as BS_Navn1, 
    B.BS_Navn as BS_Navn2, 
    c.BS_Navn as BS_Navn3, 
    coalesce(A.BS_Navn,B.BS_Navn,c.BS_Navn) as BS_Navn  
FROM 
    Book_Kalender 
    LEFT JOIN Book_Sommerhuse A ON 
     Book_Kalender.BS_ID  = A.BS_ID 
    LEFT JOIN Book_Sommerhuse B ON 
     Book_Kalender.BS_ID_Prio2 = B.BS_ID 
    LEFT JOIN Book_Sommerhuse C ON 
     Book_Kalender.BS_ID_Prio3 = C.BS_ID  
WHERE 
    Book_Kalender.BK_DatoFra BETWEEN #10/15/2017# AND #12/31/2018#; 
+0

Book_KalenderテーブルのIDはすべて同じ名前か別の名前を参照していますか? –

+0

あなたのBook_Kalendarテーブルは正規化する必要があると思います。同じテーブル内の複数のカラムに同じものを格納するときはいつでも、それらのIDを含むサブテーブルのために、外部キーを親テーブルに戻します。 – ADyson

+0

これらは異なるIDであるため、Book_Sommerhuseテーブルの異なる名前を参照します。 – Leth

答えて

2

あなたは3を必要とする参加左:

select 
    Book_Kalender.*, 
    A.BS_Navn as BS_Navn1, 
    B.BS_Navn as BS_Navn2, 
    C.BS_Navn as BS_Navn3, 
    coalesce(A.BS_Navn,B.BS_Navn,c.BS_Navn) as BS_Navn -- first non null BS_Navn 
from  
    Book_Kalender 
    LEFT JOIN Book_Sommerhuse A ON 
     Book_Kalender.BS_ID  = A.BS_ID 
    LEFT JOIN Book_Sommerhuse B ON 
     Book_Kalender.BS_ID_Prio2 = B.BS_ID 
    LEFT JOIN Book_Sommerhuse C ON 
     Book_Kalender.BS_ID_Prio3 = C.BS_ID 
+0

ありがとうございます、あなたのコードを実装しようとしていますが、Book_Kalenderに関して「Missing operator error」が表示されています。[BS_ID] = B. [BS_ID_Prio2] – Leth

+0

あなたの列名を確認してください、ブラケットを外すことができます – Indent

+0

同じエラー。私はオリジナルの投稿に完全な質問を追加しました。列名から大括弧を削除しました。 – Leth

0
SELECT 
    K.BS_ID 
    ,S1.BS_Navn 
    ,K.BS_ID_Prio2 
    ,S2.BS_Navn 'Prio2_BS_Navn' 
    ,K.BS_ID_Prio3 
    ,S3.BS_Navn 'Prio3_BS_Navn' 
FROM 
    Book_Kalender K 
LEFT JOIN 
    Book_Sommerhuse S1 ON S1.BS_ID = K.BS_ID 
LEFT JOIN 
    Book_Sommerhuse S2 ON S2.BS_ID = K.BS_ID_Prio2 
LEFT JOIN 
    Book_Sommerhuse S3 ON S3.BS_ID = K.BS_ID_Prio3 
+0

MS Accessを使用してこのクエリを実行しているため、構文が少し異なります。私のポストでそれを明確にしていないのは申し訳ありません。私が理解しているように、最初の結合節を括弧で囲んで論理的に分離する必要がありますが、それでも "欠けている演算子"エラーがスローされます。 – Leth

0

使用して、単一の列として次の3つの列のデータを提供することができ派生テーブルを使用することができ、その後、あなたは可能性このようなものを適用してください。

INNER JOIN (
       SELECT BS_IDs FROM Book_Kalender CROSS APPLY(
       VALUES (BS_ID), (BS_ID_Prio2), (BS_ID_Prio3)) Cols(BS_IDs) 
      ) DerivedBook_Kalender ON Book_Sommerhuse.[BS_ID] = DerivedBook_Kalender.[BS_IDs]