2016-05-31 14 views
0

結合は値を返しますが、値は両方のテーブルにあります。私の構文は悪いですか?左外部結合は両方のテーブルで結果を返します

select distinct source.[Manufacturer] 
    from Products2.dbo.sourceexport source 
    left join Products2.dbo.uniqueprods u 
    on source.[Manufacturer]=u.mfg 
    where u.mfg is null; 

    select [Manufacturer] from Products2.dbo.sourceexport where [Manufacturer]='XYZ'; 

    select mfg from Products2.dbo.uniqueprods where mfg='XYZ' 

選択/ステートメントに参加する約20行を返し、それはまた、行のいくつかのフォーマット「XYZ」のものであってもよいが、最初の行は、「XYZ」です。 2番目と3番目のステートメントに結果をコピーすると(私のフィールドにはltrim(rtrim(u.mfg))の有無にかかわらず)、それぞれ15と260の結果が得られます。

左側の外部結合の結果は、右側の表では0行、260では予想していたよりも多くの結果が返されます。

編集:以前の質問で私はあまりにも冗長であると言われました。どうやら、私は十分に冗長ではない。ありがとうございました。 左外部結合が必要です。意味、私はに存在しないsourceのメーカーを望みます。すべての行のすべてのフィールドを返すことができます。それが問題の解決に役立つ場合は、その結果から別のメーカーを選択するための第2ステップを作成できます。

私はクライアントが機密扱いと考える情報を含む数百万のレコードを持っています。これらのウィジェットの製造業者の業界に言及することは適切ではありません。クライアント以外の人にとって特に興味深いものでもありません。

テーブルsourceは値(a、b、c、d、f、h、j、l)を持ち、テーブルuは値(a、c、e、g、g、i、k、l) 。値(b、d、f、h、j)を返したい私はそれらにcを持たない戻り値を得ています。私はそれが(b、d、f、h、j)のすべてを含んでいるかどうか分からない。

別の質問を述べる:ステートメントの結果がどれも右の表にない左外部結合を書くにはどうすればよいですか?

Edit2:以下のステートメントからは、構文が悪くないようです。私の最初の編集質問の再記述を無効にする。元の質問文に戻り、なぜ私の左外部結合は両方のテーブルにある戻り値を返しますか?

見えない文字(ltrim(rtim())で解決する必要があります)とフィールドの種類以外に、結合を誤動作させる要因は何ですか?

+3

サンプルテーブルのデータ、現在の結果と期待される結果を追加してください! – jarlh

+0

あなたの質問はあまり明確ではありませんが、sourceexportには存在するがユニーク製品ではない行も必要ですか?また、結合クエリにはdistinct句がありますが、2番目と3番目のwhere文にはありません。それは行数が異なることがあります。 @ jarlhで述べたように休憩してください。さらに詳しい情報を追加してください。 –

+0

@AkankshaSinghありがとうございます。これが私の最初のSQL質問です。例えば、VBAは、情報がはるかに少ないことを要求し、そのオーディエンスに慣れてきたときに書いていました。そして、はい、明確な条項があります。行数は関係ありませんが、行数をインクルードする唯一の理由は、最初の文の結果が3番目の文の0行を返すためです。 0以外のものは望ましくありません。おそらく、行数が0ではないと言っているはずです。 – CWilson

答えて

1

私は、2番目と3番目のSQL文が自分の考えではなく、In句を使って最初のクエリをラップする必要があると思われます。表として 宣言@ t1のテーブルとして(メーカーVARCHAR(1)) 宣言する@ T2(MFGのVARCHAR(1))

insert into @t1 values ('a'),('b'),('c'),('d'),('f'),('h'),('j'),('l') 
insert into @t2 values ('a'),('c'),('c'),('g'),('g'),('i'),('k'),('l') 
/*query 1*/ 
    select * 
    from @t1 
    where manufacturer in(
    select distinct source.[Manufacturer] 
     from @t1 source 
     left join @t2 u 
     on source.[Manufacturer]=u.mfg 
     where u.mfg is null 
    ) 
/*Query 2*/  
    select * 
    from @t2 
    where mfg in(
    select distinct source.[Manufacturer] 
     from @t1 source 
     left join @t2 u 
     on source.[Manufacturer]=u.mfg 
     where u.mfg is null 
    ) 

クエリ1についてT1およびQuery 2返さない値@からすべての値を返します。

+0

ありがとうございました。私の2番目と3番目のクエリはデバッグ文であり、本番環境ではまったく使用されていないと思われます。これらの文は、最初の文が期待通りに機能していないことを証明するために作成されたものです – CWilson

+0

これを入力していただきありがとうございます。私が期待しているように、query1は上記のデータに対して正しく動作します。そして問題を返します。私の生きているデータの中で朗報です。だから明らかにエラーは私のデータではなく、私の声明にあるはずです。 – CWilson

関連する問題