2017-03-06 12 views
0

私は4つのテーブルを結合する必要があり、結果内の列にデータがどのテーブルから来るのかを特定する必要があります。左外部結合を使用してTbl1にTbl2に参加します。私は左外部結合を使ってTbl1にTbl3に参加し、Tbl1とTbl4に同じです。SerialNoはすべてのテーブルを結合するキーフィールドです。結果は、データがどのテーブルから来たのかを示す必要があります。テーブル間で結果を一致させるために、私は正しいテーブルを識別したい。たとえば、私のサンプルテーブルでは、SerialNoがABC123、DEF987、およびHJK321であるレコードのTbl2が結果に含まれていることを示したいとします。複数のSQL Serverの結合の結果に定数を追加する

データがデータベースから抽出されるため、ストアドプロシージャを開始できないため、プロセスで一時テーブルを利用できない限り、データを取得するビューを用意することを計画しています。私は結果に表示したいのですがどのような

Tbl1 
*Hostname* | *SerialNo* 
Laptop1  | ABC123 
Laptop2  | DEF987 
Desktop1 | WER987 
Desktop2 | YRT848 
Desktop3 | YTT876 
Laptop2  | HJK321 

Tbl2 
*Location* | *SerialNo* 
MS  | ABC123 
CO  | DEF987 
CA  | ZYC342 
AZ  | XYZ789 
IN  | HJK321 

...

Result1 
*Hostname* | *SerialNo* |*Location* |*RecordOrigin* 
Laptop1  | ABC123  |MS   |Tbl2 
Laptop2  | DEF987  |CO   |Tbl2 
Desktop1 | WER987  |NULL  |Tbl1 
Desktop2 | YRT848  |NULL  |Tbl1 
Desktop3 | YTT876  |NULL  |Tbl1 
Laptop2  | HJK321  |IN   |Tbl2 
私はRecordOrigin情報のための追加的なテーブルを作成しようとしたが、私が正しく、他のテーブルに参加することができませんでした

ソーステーブルテーブル(Tbl1、Tbl2など)のデータを編集したり、構造を変更したりすることができません。

答えて

0

あなたは、テーブルが列またはいないので、好きな戻っているかどうかを確認するためにcase表現を使用することができます。

select 
    t.Hostname 
    , t.SerialNo 
    , l.Location 
    , RecordOrigin = case 
     when l.SerialNo is not null 
     then 'Tbl2' 
     else 'Tbl1' 
     end 
from Tbl1 as t 
    left join Tbl2 as l 
    on t.SerialNo = l.SerialNo 
0

を私はUNIONでのテーブルをそれを考え出しして削除するDISTINCTとMAXを使用しているかもしれないと思います複製。

SELECT DISTINCT Hostname, MAX(SerialNo), MAX(Location), RecordOrigin 
FROM 
(
SELECT Hostname, SerialNo, Location, 'Tbl1' AS RecordOrigin 
FROM Tbl1 

UNION 

SELECT Hostname, SerialNo, Location, 'Tbl2' AS RecordOrigin 
FROM Tbl1 
) 
GROUP BY Hostname, RecordOrigin 
関連する問題