0

私は問題があります。同じ列のテーブルが2つあります。これらの2つのテーブルからidの行を持つ3番目のテーブルを作成します。ここで、選択した4つの列は同じになります。

データnullとisnullを比較する際の問題を解決しました。

私はこのようなものを書きました:

WITH cteCandidates (City, Street, HouseNumber, PostCode)
  AS
  (
    SELECT City, Street, HouseNumber, PostCode
    FROM Gymnasium
    INTERSECT
    SELECT City, Street, HouseNumber, PostCode
    FROM PrimarySchool
  ) 
  select e.Id as 'Gymnasium',
  p.Id as 'PrimarySchool'
FROM
  Gymnasium AS e
Inner join cteCandidates AS c
    on isnull(e.City       ,'999999') = isnull(c.City       ,'999999')
   AND isnull(e.Street     ,'999999') = isnull(c.Street     ,'999999')
   AND isnull(e.HouseNumber,'999999') = isnull(c.HouseNumber,'999999')
   AND isnull(e.PostCode   ,'999999') = isnull(c.PostCode   ,'999999')
inner join PrimarySchool as p 
    on isnull(e.City       ,'999999') = isnull(p.City       ,'999999')
   AND isnull(e.Street     ,'999999') = isnull(p.Street     ,'999999')
   AND isnull(e.HouseNumber,'999999') = isnull(p.HouseNumber,'999999')
   AND isnull(e.PostCode   ,'999999') = isnull(p.PostCode   ,'999999')
order by PrimarySchool

次のコードを除いて、すべて正常に動作します。

 SELECT City, Street, HouseNumber, PostCode
    FROM Gymnasium
    INTERSECT
    SELECT City, Street, HouseNumber, PostCode
    FROM PrimarySchool

最初のコードとは異なる行数を返しました。

私は何が間違っているのですか?

4

2 に答える 2

2

これは、(City、Street、HouseNumber、PostCode)列の重複によってのみ説明できます。Intersectはone、複製されたすべてのデータに対して正確に行を返しますが、内部結合はn*m一致する行を作成します。これらの4つの列がGymnasiumとPrimarySchoolの両方で一意であることを確認してください。

于 2012-03-27T21:07:11.610 に答える
0

あなたが間違っている唯一のことは、2つのクエリが同じ数の行を返すことを期待していることです。

最初に、nullを「999999」に置き換えてから、結果の値を比較します。これにより、すべてのnullが他のすべてのnullと等しくなります(値は「999999」ですが、おそらくその値は発生しません)。

2番目のクエリでは、nullを置き換えずに交差点で実行しています。NULLが他の値(他のNULLを含む)と等しくなることはないため、返される行は少なくなります。

于 2012-03-27T20:44:27.527 に答える