1

私は3つのテーブルを持っています:

PERSON
-ID_PERSON
-NAME
-SURNAME

PERSON_ADDRESS
-ID_PERSON
-ID_ADDRESS

ADDRESS
-ID_ADDRESS
-NR_LOCAL
-NR_HOME
-PLACE

id_person=1 の ADRESS テーブルのすべてのレコードを削除したい

私のクエリ(オラクルで)

DELETE * FROM address INNER JOIN person_addres ON
address.id_address=person_addres.id_address 
WHERE person_addres.id_person=1 ;
4

5 に答える 5

1

あなたの場合personaddressテーブルには多対多の関係があります。これは、1人が複数のアドレスを持つことができ、同時に1つのアドレスが複数の人に属する可能性があることを意味します。address特定の人の住所を削除し、それをテーブルから削除したい。次のような状況を考えてみましょう。表によれば、ID =1の人はID=2の住所を持ち、ID = person_address2の人は同じ住所(ID = 2)を持ちます。人物#1(ID = 1)に関連する住所レコードを削除した場合はどうなりますか?人物#2は住所なしで残されるか、またはあなたが取得integrity constraint violatedします(オプションによって異なりon deleteます)。

特定の人の住所を削除するには、他の人の住所をそのままにしておくことをお勧めします。person_addressではなく、テーブルからレコードを削除することをお勧めしますaddress。そしてaddress、そのアドレスが割り当てられた人がいない場合にのみ、テーブルからレコードを削除します。

person_address特定の人物(この場合はID = 1の人物)のすべての「アドレス」(テーブルのすべてのレコード)を削除するには、次のSQLを使用できます。

delete 
  from (select q.id_person
          from address t
          join person_address q
            on (q.id_address = t.id_address)
        ) x
  where x.id_person = 1 
于 2012-09-22T09:52:45.440 に答える
0

「id_person=1 の ADRESS テーブルのすべてのレコードを削除したい」

Person と Address の間に多対多の関係があります。これは、Persons where によって使用される Address レコードを削除することを意味しますid_person != 1。それはあなたが本当にやりたいことですか?

その場合は、次の 3 つの手順でこれを行う必要があります。

  1. whereのすべての値を取得 id_addressするperson_addressid_person=1
  2. で一致したすべてのレコードを削除しますperson_address
  3. で一致したすべてのレコードを削除しますaddress

Oracle では、一括アクションと定義済みの ODCINUMBERLIST コレクションを使用して、2 つのステートメントでこれを行うことができます (ID が数値であることを願っています)。

declare
    addr_nt ODCINUMBERLIST;
begin
    delete from person_address
    where id_person=1
    returning id_address bulk collect into addr_nt;

    forall i in addr_nt.first..addr_nt.last
        delete from address
        where addr_id = addr_nt(i);
 end;

もちろん、テーブル間に外部キーが定義されていない場合は、他の提案に従って、テーブルから簡単に削除できaddressます。データは破損して信頼できなくなりますが、それはリレーショナル整合性を強制しないことの代償です。

于 2012-09-22T08:43:38.523 に答える
0

テーブル person_addressには、テーブル person および address に対する外部キー制約が必要です。個人を適切に削除するには、この手順の使用を検討してください。

私は個人的に個人の詳細を削除することは決してありませんが、表の個人に個人のステータス(アクティブまたは非アクティブなど)の列を作成します。

create or replace procedure remove_person(p_id_person in person.id_person%type )
is
begin
    delete from person where id_person = p_id_person;
    delete from address where id_address in (select id_address from person_address where id_person = p_id_person);
    delete from person_address where id_person = p_id_person;

-- no exception handling, I want to know when this fails
end;

次に、次のように使用します。

begin
  remove_person(1);
end;
于 2012-09-22T09:47:43.827 に答える
-1

サブセレクトを試してみてください-申し訳ありませんが、私のOracleは錆びています:

DELETE * FROM address WHERE id_address IN (SELECT id_address FROM person_address WHERE id_person = 1)
于 2012-09-22T08:06:54.983 に答える
-1

まず、person_id = 1であるpersonaddressからアドレスidを選択し、次に、addressiが前のクエリの結果と等しいアドレスから行を削除します。それで全部です

DELETE * FROM ADDRESS WHERE ID_ADDRESS IN ( SELECT ID_ADDRESS FROM PERSON_ADDRESS WHERE ID_PERSON='1')
于 2012-09-22T08:11:16.657 に答える