2016-07-15 14 views
1

連絡先を会社に関連付けるテーブルがあります。複数の連絡先が追加された場合、「プライマリ」または「セカンダリ」の連絡先を設定するオプションがあります。しかし、人々が連絡先を追加しているときには、この機能を使用していません。プログラムが修正され、企業に追加された最初の連絡先が自動的にプライマリとしてマークされますが、すでに入力されたデータは修正されません。SQL:列に基づいて一意の行を更新する

私はテーブルをポーリングして、CompanyIDごとに1つのレコードしかない場合は、PrimaryContactをtrueに設定しますが、これを行う方法を理解することはできません。複数の連絡先が割り当てられている会社の場合は、何もしたくありません。例:

CompanyID ContactID PrimaryContact 
1   285   0 
2   375   0 
3   761   0 
4   1744  0 
4   2301  0 
6   335   0 
6   4987  0 
9   809   0 
9   2119  0 
10   99   0 
11   99   0 

上記の例では、CompanyID4,6,9には複数のエントリがありますので、それらに触れたくありません。しかし、1、2、3、10、および11には1つのエントリしかないので、これらの行に対してPrimaryContactを1に設定したいとします。

どうすればいいですか?

update contacts 
set PrimaryContact = 1 
where CompanyID in (
    select CompanyID 
    from contacts 
    group by CompanyID 
    having count(distinct ContactID) = 1 
) 

質問は以前のMySQLとしてタグ付けされ、以下のオリジナルの答えはそれに適応されます。

+0

私の前のクエリが間違っていた、更新の連絡先がPrimaryContact =セットC1、このクエリをしようとした場合((SELECT COUNT(1)のコンタクトC2からどこc2.CompanyIDによってc2.CompanyID = c1.CompanyIDグループ) > 1、0、1) –

答えて

1

あなたがMS SQL Server用したい構文がこれです。

これはそれを行うための一つの方法である:

派生テーブルで
update contacts as c 
inner join 
(
    select CompanyID 
    from contacts 
    group by CompanyID 
    having count(distinct ContactID) = 1 
) t on c.CompanyID= t.CompanyID 
set PrimaryContact = 1; 

あなたが1つのContactIDを持ってCompanyIDsを見つけます。そのクエリの結果は、更新する必要があるテーブルと結合されます。

Sample SQL Fiddle

+0

内部結合後のselectステートメントは、1つのエントリ(1,2,3,10、および11)を持つ行を正しく識別しますが、MS SQL Server全体で動作する更新を取得できませんManagement Studio(2014)。それは "as c"の部分が好きではないようです。そこで、テーブルに対してクエリを実行し、唯一のフィールドとして "CompanyID"という名前の新しいテーブルtCompanyIDsに結果をコピーしました。私はそれから私のクエリでそれを使用しました: – Allan

+0

@Allanあなたは[tag:MySQL]タグで質問にタグを付けました。私の答えの構文はそのデータベースに適合しています。 MS SQL Serverを使用している場合は、質問のタグを変更してください。回答を更新します。 – jpw

+0

あなたのMySQLの例でも、動作するように変更することができましたが、SQL Serverのバージョンを投稿してくれてありがとう...私はそれが再び出てくると思います。 – Allan

関連する問題