0

私は2つのテーブルTableATableB. TableAには列newValueとがありますoldValueTableB列がありますvalue

次の結果が必要です:に存在する場所と存在しない場所TableAからすべての行を取得します。newValueTableBoldValueTableB

どちらのテーブルにも多くの行があるため、パフォーマンスが重要です!

SQL Server 2010/2012 でそれをどのように達成しますか?

(ui: この質問のプロパティ タイトルが見つかりませんでした)。

編集:

私が最初に試したことは次のとおりです。

SELECT newValue, oldValue
FROM TableA
WHERE newValue IN (SELECT value FROM TableB) 
  AND oldValue NOT IN (SELECT value FROM Table B)

しかし、これは非効率的であり、私のデータベースではパフォーマンスが低下します。私は他の解決策を探しています。

4

6 に答える 6

0

EXISTSここでは回避しINて速度を向上させると思います:

SELECT
        *
    FROM TableA
    WHERE
        (SELECT TOP 1 1 FROM TableB WHERE value = newValue) IS NOT NULL
        AND
        (SELECT TOP 1 1 FROM TableB WHERE value = oldValue) IS NULL
于 2013-09-11T10:45:57.630 に答える
0

存在する/存在しないを使用できます

SELECT newValue, oldValue
FROM TableA as t1 
where exists(SELECT value FROM TableB as t2 where t1.newValue=t2.value) and 
 not exists(SELECT value FROM TableB as t3 where t1.olvalue=t3.value)
于 2013-09-11T10:46:11.163 に答える
0

valuenewvalueおよびにインデックスがある場合はoldvalue、これを試すことができます。

select
    a.newValue, a.oldValue
from TableA as a
where
    a.newValue in (select distinct b.value from TableB as b) and
    a.oldValue not in (select distinct b.value from TableB as b)

またはexists:

select
    a.newValue, a.oldValue
from TableA as a
where
    exists (select * from TableB as b where b.value = a.newValue) and
    not exists (select * from TableB as b where b.value = a.oldValue)
于 2013-09-11T10:52:26.157 に答える
-1

してみてください:

select * from TableA where newValue in (select value from TableB)
union
select * from TableA where oldValue not in (select value from TableB)
于 2013-09-11T10:40:03.040 に答える
-1

単一の存在条件でそれを行うことができます。

 SELECT newValue, oldValue
 FROM TableA a
 WHERE exists 
 (
  SELECT 1 FROM TableB b 
  where a.newValue = b.value 
  and a.oldValue != b.value)
于 2013-09-11T11:14:00.267 に答える