0

必要な結果が得られる既存のクエリがありますが、別のテーブルから列を追加し、同じ 203 行を取得する必要があります...そのテーブルに結合しようとすると、何千もの行が取得されます...

select a.state, a.alternate_id, a.reg_id 
from altid1 a, altid1 b 
where a.alternate_id=b.alternate_id 
and a.reg_id <> b.reg_id 
group by  a.state, a.alternate_id, a.reg_id
having count(a.alternate_id)>1
order by state, alternate_id,reg_id;

これにより、状態と、複数の reg_id を持つ各代替 ID が得られます...今度は、altid1 テーブルに存在しない 2 つの所有者フィールドを追加する必要があります

所有者テーブルに参加し、追加の列だけで同じ 203 の結果を取得する必要があります...所有者テーブルには reg_id 列が含まれていますが、異なる reg_id を持つものを取得しようとしているときに、どのように一致させることができますか?元のテーブルに?

select a.state, a.alternate_id, a.reg_id, c.owner1, c.ownertype1 
from altid1 a, altid1 b, owner c 
where a.alternate_id=b.alternate_id 
and a.reg_id <> b.reg_id
group by  a.state, a.alternate_id, a.reg_id, c.owner1, c.ownertype1
having count(a.alternate_id)>1
order by state, alternate_id, reg_id;

ご協力ありがとうございました!

4

2 に答える 2

0

これを試してください。[id column] を実際のフィールド名に変更し、a または b テーブルが c テーブルとの関係を持っていることを確認してください。

  select a.state, a.alternate_id, a.reg_id, c.owner1, c.ownertype1 
    from altid1 a, altid1 b, owner c 
    where a.alternate_id=b.alternate_id 
    and a.reg_id <> b.reg_id
    and c.[id column] = a or b . [id column] -- change id column to actual id field from the table and change a or b to the correct table having relationship with c table.
    group by  a.state, a.alternate_id, a.reg_id, c.owner1, c.ownertype1
    having count(a.alternate_id)>1
    order by state, alternate_id, reg_id;
于 2013-10-18T16:11:42.830 に答える
0

owner選択しているテーブルに追加したときに、追加の結合条件を追加していません。これは、元の 203 行の結果と の間でクロス結合を実行することを意味しますowner

2 つのテーブル間のクロス結合は、可能な行のペアごとに 1 つの行と 1 つの行を返しAます。したがって、行があり、行がある場合、クロス結合には行があります。良くない。BABAnBmABm*n

必要なことは、where ステートメントに句を追加することです。あなたのコードからそれがどうなるか正確にはわかりません。ownerにリンクしているコラムはありますaltid1か?

しかし、おそらくもっと重要なのは、コンマ結合を使用しないことです。それらは、クロス結合やその他の恐ろしい恐ろしいことを誤って作成することを非常に簡単にします。大規模なデータベースで誤ってクロス結合を行った場合、すぐに数百万行になる可能性があります。

代わりに、where 句のみを使用して結果をフィルタリングし、標準のJOIN構文を使用して追加のテーブルを結合します。

元のクエリは次のようになります。

select a.state, a.alternate_id, a.reg_id 
from altid1 a
inner join altid1 b
   on a.alternate_id = b.alternate_id
where a.reg_id <> b.reg_id 
group by  a.state, a.alternate_id, a.reg_id
having count(a.alternate_id)>1
order by state, alternate_id,reg_id;

次に、新しいクエリは次のようになります (リンクowner先を推測しているだけですaltid1)。

select a.state, a.alternate_id, a.reg_id 
from altid1 a
inner join altid1 b
   on a.alternate_id = b.alternate_id
inner join owner c
   on c.owner_id = a.owner_id
where a.reg_id <> b.reg_id 
group by  a.state, a.alternate_id, a.reg_id
having count(a.alternate_id)>1
order by state, alternate_id,reg_id;

内部結合を使用したことに注意してください。owner内部結合または左結合のどちらで持ち込む必要があるかという質問からはわかりません。違いの簡単な説明は、一致する行ownerが見つからない行が内部結合に含まれないことです。

PSコンマ結合を使用しないでください

于 2013-10-18T16:26:52.023 に答える