0

私は SQL に病的な問題を抱えているので、SQL の問題を処理するための迅速なソフトウェア アプリケーションを構築することで、データベースの問題をすべて整理しています。

(この場合もそうしています)

StackOverflow のおかげで、私は正しさを恥じることができると思うので、実際の SQL または T-SQL 自体でこの種の SQL トラブルシューティングを行う方法を学びたいと思います (可能であれば):

私は持っている:

データベース DB1 テーブル A (ユニット番号、ビル番号)

データベース DB2 テーブル B (unitNo、BuildingNo)

  1. データベース DB2 からテーブル B に存在しない、データベース DB1 からテーブル A に存在するユニット (ユニット番号) を考え出します。

  2. 同じユニット番号を持つ複数のユニットが存在する可能性があります。これは、同じユニット番号が異なる建物のユニットに与えられる可能性があるためです。

  3. どのデータベースにも書き込みアクセス権がありません。

これが「ギミー・テ・コズ」の投稿と見なされないことを願っています。私よりもSQLに精通している人がこの種のアルゴリズムをソートする方法を知りたいです.チュートリアルやヒントへの投稿は大歓迎です.完全なコードは必要ありません.しかし、それが理にかなっているのであれば、そうしてください。

最初は、あるテーブルからすべてのユニット番号を取得し、他のテーブルからの選択でそれらを除外できると思っていました。

select concated.unit from 
( SELECT (  unitNo + ',' + CONVERT(varchar(12), BuildingNo) ) as unit
FROM A) concated 
having concated.unit not in

(
'201,1',
'202,1',
'203,1',
'204,1',
'205,1',
'206,1',
[...]

これは通常は機能しますが、1 つのテーブルからのユニットの数が非常に多いため、これを試みると SQL サーバーが次のようにクラッシュします。

「スタックスペースが不足しました」

ありがとう、

リック

4

2 に答える 2

3

完全な外部結合を探していると思います。これにより、パート 1 で求めたユニット番号が得られます。

Select 
   A.UnitNumber, B.UnitNumber
from
   DB1.dbo.TableA A FULL OUTER JOIN DB2.dbo.TableB B 
       on A.UnitNumber = B.UnitNumber
       and A.BuildingNumber = B.BuildingNumber
Where
   A.UnitNumber is null or B.UnitNumber is null

興味を引く可能性のあるその他のクエリを以下に概説します。

これにより、B ではなく A のレコードが得られます。

Select
    A.UnitNumber
From
    DB1.dbo.TableA A Left Join DB2.dbo.TableB B 
        on A.UnitNumber = B.UnitNumber 
        and A.BuildingNumber = B.BuildingNumber
Where
    B.UnitNumber is null

そして、A にはない B のレコードを見つけるために、それを逆にするだけです。

Select
    B.UnitNumber
From
    DB2.dbo.TableB B left join DB1.dbo.TableA A 
        on B.UnitNumber = A.UnitNumber
        and B.BuildingNumber = A.BuildingNumber
Where
    A.UnitNumber is null
于 2009-02-18T10:58:57.647 に答える
2

JPunyonが言ったように、しかし、それらすべてを1つのリストに入れたい場合は、次のようになります:

Select 
    [UnitNumber] = COALESCE(A.UnitNumber, B.UnitNumber),
    [Source] = CASE WHEN A.UnitNumber IS NOT NULL THEN 'A' ELSE 'B' END
from
    DB1.dbo.TableA A
    FULL OUTER JOIN DB2.dbo.TableB B 
        on A.UnitNumber = B.UnitNumber
Where
    A.UnitNumber is null or B.UnitNumber is null
ORDER BY COALESCE(A.UnitNumber, B.UnitNumber)
于 2009-02-18T11:16:13.813 に答える