1

それぞれ次の id 列を持つ 2 つのテーブルがあります。

Ticker
SEDOL,
ISIN

各行には、値が移入されたこれらの列が 1 つ以上あります。値のある列に参加したいと思います。この方法で参加する方法を知っている人はいますか?ありがとう。

4

3 に答える 3

3

TickerSEDOLおよびISINすべて異なる形式であるため、必要だと思います

SELECT *
FROM   T1
       JOIN T2
         ON T1.Ticker = T2.Ticker
             OR T1.SEDOL = T2.SEDOL
             OR T1.ISIN = T2.ISIN 

ただし、テーブルが大きい場合はパフォーマンスが低下します。INNER JOIN 条件で「OR」を使用することは悪い考えですか? を参照してください。.

両方のテーブルが特定のセキュリティに提供される列で一貫している場合、ネストされたループだけでなくハッシュまたはマージ結合を使用できるため、これは潜在的にはるかに高速になります。

SELECT *
FROM   T1
       INNER JOIN T2
         ON EXISTS (SELECT T1.Ticker,
                           T1.SEDOL,
                           T1.ISIN
                    INTERSECT
                    SELECT T2.Ticker,
                           T2.SEDOL,
                           T2.ISIN) 

または、テーブルに一貫性がない場合は、別のオプションが考えられます

SELECT *
FROM   T1
       INNER JOIN T2
         ON T1.Ticker = T2.Ticker
UNION
SELECT *
FROM   T1
       INNER JOIN T2
         ON T1.SEDOL = T2.SEDOL
UNION
SELECT *
FROM   T1
       INNER JOIN T2
         ON T1.ISIN = T2.ISIN 
于 2013-08-09T21:03:48.053 に答える
0

ON 部分で ISNULL キーワードを使用できます。

Select *
From tab1
inner join tab2 on tab1.ColName = Isnull(Isnull(tab2.Ticker,tab2.SEDOL),tab2.ISIN)

コメントの後に追加: このクエリは、1 つのテーブルの 1 つの列に値があり、もう 1 つのテーブルに 3 つの列があり、常に 2 つが null で、1 つが最初のテーブルの列と一致する必要がある値を持つと仮定して実行されます。はISNULL、3 つの値から正しい値を選択するために使用されます。

于 2013-08-09T21:07:27.427 に答える
0
select *
from T1
    inner join T2 on T2.Ticker = coalesce(T1.Ticker, T1.SEDOL, T1.ISIN)

ただし、T1 の値が null ではなく、T2 に対応する値がない可能性がある場合は、次のことができます。

select *
from T1
    outer apply
    (
        select top 1 T2.Col
        from T2
        where T2.Ticker in (T1.Ticker, T1.SEDOL, T1.ISIN)
        order by
             case
                 when T2.Ticker = T1.Ticker then 0
                 when T2.Ticker = T1.SEDOL then 1
                 when T2.Ticker = T1.ISIN then 2
             end
    )

またはあなたができる

select *, coalesce(T21.Col, T22.Col, T23.Col) as T2_Col
from T1
    left outer join T21 on T21.Ticker = T1.Ticker
    left outer join T22 on T22.Ticker = T1.SEDOL
    left outer join T23 on T23.Ticker = T1.ISIN
于 2013-08-09T21:26:17.880 に答える