2017-02-22 5 views
0

いくつかのテーブルからデータを取り出すために結合を使用しています。結合クエリから必要なデータの2つの列が表の同じ列にあります。これは次のように返しているjoinを使用して同じ列の複数のデータセルを返す

SELECT [contract_member_brg_attr].field_id, 
     [contract_member_brg_attr].attr_val AS 'properties', 
     [contract_attr].attr_val   AS 'contract_number', 
     [contract_attr].attr_val   AS 'supplier_number' 
FROM [contract_member_brg_attr] 
     INNER JOIN [contract_member_brg] 
       ON [contract_member_brg_attr].item_id = 
        [contract_member_brg].item_id 
     INNER JOIN [contract_attr] 
       ON [contract_attr].item_id = 
        [contract_member_brg].[contract_item_id] 
        AND [contract_attr].field_id = 413 

:ここ

は、私が今持っているものです。

enter image description here

あなたは、彼らが同じ列から来て、私はそれらの1(413)によってフィルタリングしていますので、返されて、最後の2行が同じである見ることができるように。それは()から引っ張っだのはここ

は次のとおりです。

enter image description here

私は2列目に413および234からの値を必要としています。

私は234(OR [CONTRACT_ATTR].field_id = 234)でフィルタすることを追加しようとするも、すべての休憩:

enter image description here

私が間違って何をやっていると私はそれをどのように修正するのですか?

+0

実際には、それらの行はすべて同じではありません。彼らはすべて異なっている。ここで何をしようとしていますか? –

+0

2行のデータ項目を最終結果に2つの別々の列として表示したいですか?あなたは '[contract_attr]'テーブルを一度しか使用していません。 2番目の属性を取得するためにエイリアスを使って 'JOIN'または' LEFT JOIN'を再度呼び出します。 – mheptinstall

+0

@SeanLange 2番目の画像では、12/234/A180と12/413/b5v5b5b5bb5が表示されますか?私は、それらの両方を結合クエリの列として受け取るようにします。 –

答えて

2

あなたは、私はそれ[other_contract_attr]と呼ばれている。しかしfield_idの234

SELECT [contract_member_brg_attr].field_id, 
     [contract_member_brg_attr].attr_val AS 'properties', 
     [contract_attr].attr_val   AS 'contract_number', 
     [other_contract_attr].attr_val   AS 'supplier_number' 
FROM [contract_member_brg_attr] 
     INNER JOIN [contract_member_brg] 
       ON [contract_member_brg_attr].item_id = 
        [contract_member_brg].item_id 
     INNER JOIN [contract_attr] 
       ON [contract_attr].item_id = 
        [contract_member_brg].[contract_item_id] 
        AND [contract_attr].field_id = 413 
    INNER JOIN [contract_attr] AS [other_contract_attr] 
       ON [other_contract_attr].item_id = 
        [contract_member_brg].[contract_item_id] 
        AND [other_contract_attr].field_id = 234 

に結果を制限し、それはあなたがしているように見えます。この例ではそれにエイリアスを与えることによって、同じテーブルを再利用することができますPIVOT列にしようとすると、複数の行を同じ表の列に戻したい場合は、PIVOTのように値を入力して、代わりにそのようにしてください。

SELECT 
[item_id], 
MAX(CASE WHEN [field_id] = 413 
    THEN [attr_val] 
END) AS [413_val], 
MAX(CASE WHEN [field_id] = 234 
    THEN [attr_val] 
END) AS [234_val], 

FROM 
[contract_attr] 

GROUP BY 
[item_id] 
+0

パーフェクト、私は今理解しています。ありがとう! –

2

これはあなたの質問に対する回答ではありませんが、コメントには長すぎます。クエリでエイリアスを使用した場合、読みやすく管理しやすくなります。本当に長いテーブル名の代わりにエイリアスを使用するだけで、クエリがどのように表示されるかがここにあります。

SELECT mba.field_id, 
     mba.attr_val AS 'properties', 
     ca.attr_val AS 'contract_number', 
     ca.attr_val AS 'supplier_number' 
FROM contract_member_brg_attr mba 
     INNER JOIN contract_member_brg mb 
       ON mba.item_id = 
        mb.item_id 
     INNER JOIN contract_attr ca 
       ON ca.item_id = 
        mb.contract_item_id 
        AND ca.field_id = 413 
+0

クールな豆..:D –

+1

確かに開発者にとってより親しみやすい。 :P –

関連する問題