3

Reason_Id に基づいて別のテーブルから複数のフィールドの Reason_Descriptions を取得するには、2 つのテーブルを結合する必要があります。私の問題は、フィールド値を比較する方法がわからないことです。

Table 1:
  Reason_Id,
  Reason_Description


Table 2:
  Reason1_Id,
  Reason2_Id,
  Reason3_Id

表 2 のフィールドの値は、表 1 の Reason_Id フィールドの値と常に一致します。ID の代わりに説明を表示するだけです。どんな助けでも大歓迎です。あるテーブル フィールドが別のテーブル フィールドと一致する単純な結合を行う方法は知っていますが、この場合、テーブル 2 からの各 Reason1、2、3 には、テーブル 1 と一致する異なる理由 ID があります。

4

6 に答える 6

2

テーブル 2 のフィールドごとに 1 回ずつ、説明テーブルに 3 回参加する必要があります。

例えば:

SELECT Desc1.Reason_Description AS Reason1_Description, 
       Desc2.Reason_Description AS Reason2_Description, 
       Desc3.Reason_Description AS Reason3_Description 
FROM Table2
JOIN Table1 Desc1 ON Table2.Reason1_Id = Desc1.Reason_Id
JOIN Table1 Desc2 ON Table2.Reason2_Id = Desc2.Reason_Id
JOIN Table1 Desc3 ON Table2.Reason3_Id = Desc3.Reason_Id
于 2012-11-29T20:50:10.703 に答える
0

私のオフィスでは、この種のプロセスを数多く行っています。セキュリティとサーバーレベルに基づく能力がある場合は、関数を使用します。プロセッサの反復ではコストがかかる可能性がありますが、巨大なテーブルがない場合 (最大数百万のレコードでこれを行います)、インライン スカラー関数を使用するとコードがきれいになります。

CREATE FUNCTION dbo.fnc_GetReasonDesc (@ReasonId as int) RETURNS varchar(50) AS
  BEGIN
    DECLARE @rDesc as varchar(50)
    SElECT @rDesc = Reason_Description From Table2 WHERE Reason_id = @ReasonId
    RETuRN @rDesc
  END

Select dbo.fnc_GetReasondesc(Reason1_Id), dbo.fnc_GetReasonDesc(Reason2_Id), ...

最大の利点は、操作する必要がある Id フィールドの数や、それらが含まれる異なるテーブルの数に関係なく、常に同じ関数を使用して id から desc に変換できることです。列挙テーブルを作成して「説明タイプ」を含めることもできるため、理由の説明と問題の説明、またはアクティビティの説明などがある場合は、「説明」テーブルに「説明タイプ」などの追加フィールドを追加できます。 、その値を関数パラメーターに含めます。同じテーブルと関数で、必要な数の異なる列挙子を処理できるようになりました。

お役に立てれば

于 2012-11-29T21:05:58.617 に答える
0

このバージョンは、Table1 を 3 回ではなく 1 回しか通過しないため、大きなテーブルの場合により効率的であると考えています。

ここに答えを残しておくと、学術的な関心が寄せられますが、複数の結合オプションよりもパフォーマンスが悪いため、これを使用しないでください。

if OBJECT_ID('Table2') is not null drop table Table2
if OBJECT_ID('Table1') is not null drop table Table1


create table Table1
(
  Reason_Id bigint not null identity(1,1) primary key clustered
  , Reason_Description nvarchar(256)
)
create table Table2
(
    Id bigint not null identity(1,1) primary key clustered
  , Reason1_Id bigint foreign key references Table1(Reason_Id)
  , Reason2_Id bigint foreign key references Table1(Reason_Id)
  , Reason3_Id bigint foreign key references Table1(Reason_Id)
)
insert Table1 select 'Desc 1'
insert Table1 select 'Desc 2'
insert Table1 select 'Desc 3'
insert Table1 select 'Desc 4'

insert Table2 select 1, 2, 3
insert Table2 select 4, 4, 4

select a.id 
, max(case when a.Reason1_Id = b.Reason_Id then b.Reason_Description end)
, max(case when a.Reason2_Id = b.Reason_Id then b.Reason_Description end)
, max(case when a.Reason3_Id = b.Reason_Id then b.Reason_Description end)
from Table2 a
left outer join Table1 b --could do an inner join but left outer is safer
on b.Reason_Id in (a.Reason1_Id, a.Reason2_Id, a.Reason3_Id)
group by a.Id 

上記を複数のテーブル結合オプションと比較する SQL Fiddle リンクは次のとおりです: http://sqlfiddle.com/#!3/1f5e6/1

于 2012-11-29T21:06:49.657 に答える
0
select * from t1 inner join t2 
 on t1.Reason_Id = t2.Reason1_Id
    or t1.Reason_Id = t2.Reason2_Id
    or t1.Reason_Id = t2.Reason3_Id

ここでそれを見てみましょうhttp://sqlfiddle.com/#!3/3b9d1/2

于 2012-11-29T20:51:18.627 に答える
0
select Reason_Description
from table1 a
Inner join table2 b
  On a.Reason_id = b.Reason1_Id
Union
select Reason_Description
from table1 a
Inner join table2 b
  On a.Reason_id = b.Reason2_Id
Union
select Reason_Description
from table1 a
Inner join table2 b
  On a.Reason_id = b.Reason3_Id
于 2012-11-29T20:52:31.357 に答える
0

基本的UNPIVOTに2番目のテーブルを作成してから、値を結合できます。UNPIVOT関数がない場合は、次を使用できますUNION ALL

select t1.reason_description, t2.col
from table1 t1
left join
(
  select reason1_id value, 't2_reason1_id' col
  from table2
  union all
  select reason2_id value, 't2_reason2_id' col
  from table2
  union all
  select reason3_id value, 't2_reason3_id' col
  from table2
) t2
  on t1.reason_id = t2.value

がある場合はUNPIVOT、次のようなものを使用できます。

select t1.reason_description
from table1 t1
(
  select value, col
  from table2
  unpivot
  (
    value for col in (reason1_id, reason2_id, reason3_id)
  ) un
) t2
  on t1.reason_id = t2.value
于 2012-11-29T20:54:59.807 に答える