2016-12-04 6 views
1

Ich habe zwei Tabellen:Extract inversed duplizierte Werte sql

  • Likes (IDPerfilA, IDPerfilB, Data)
  • Amizade (IDPerfilA, IDPerfilB, Daten)

* Amizade = Freunde auf Englisch .

Meine Tabelle Likes ist mit vielen Likes hochgeladen, mit der Einschränkung, die nicht erlaubt, dass IDPerfilA die gleiche IDperfilB mag (EX: Benutzer mit der ID 4 con nicht wie Benutzer mit der ID 4).

Nun, ich möchte, dass meine Freunde Tabelle mit den folgenden IDs hochladen: Benutzer

Wenn besteht in der Gleichen Tabelle 4 gefällt 8 und 8 gefällt 4, dann ist es eine Freundschaft ist, so gehen sie an Freunde und werden aus Likes gelöscht.

Ich habe folgendes probiert, aber meine Freunde Tabelle als inversed dupliziert Werte (Beispiel: 4 ist befreundet mit 8 und 8 ist befreundet mit 4)

INSERT INTO AMIZADE (IDPERFILA, 
        IDPERFILB, 
        DATA) 
SELECT a.IDPERFILA, a.IDPERFILB, a.DATA 
FROM LIKES as a, LIKES as b 
WHERE (a.IDPERFILB = b.IDPERFILA AND a.IDPERFILA = b.IDPERFILB) 

ich den folgenden Code verwendet, Freunde löschen aus mag:

DELETE LIKES 
from 
LIKES as l inner join amizade as a 
on a.IDPERFILA = l.IDPERFILA 
    and a.IDPERFILB = l.IDPERFILB 
    and a.DATA = l.DATA 

Wenn mir jemand es wäre toll, helfen könnte! Danke im Voraus.

Antwort

0

wird das funktionieren?

INSERT INTO AMIZADE (IDPERFILA, 
        IDPERFILB, 
        DATA) 
SELECT DISTINCT CASE WHEN (a.IDPERFILA > a.IDPERFILB) THEN a.IDPERFILA 
      ELSE a.IDPERFILB 
      END 
     , CASE WHEN (a.IDPERFILA <= a.IDPERFILB) THEN a.IDPERFILB 
      ELSE a.IDPERFILA 
      END 
     , a.DATA 
FROM LIKES as a, LIKES as b 
WHERE (a.IDPERFILB = b.IDPERFILA AND a.IDPERFILA = b.IDPERFILB) 
0

Ich vermute, dass Sie das Paar (4, 8) wollen nur einmal in der Freunde Tabelle angezeigt werden. Ich würde für:

INSERT INTO AMIZADE (IDPERFILA, IDPERFILB, DATA) 
    SELECT l.IDPERFILA, l.IDPERFILB, l.DATA 
    FROM LIKES l 
    WHERE EXISTS (SELECT 1 
        FROM LIKES l2 
        WHERE l2.IDPERFILA = l.IDPERFILB AND l2.IDPERFILB = l.IDPERFILA 
       ) AND 
      l.IDPERFILA < l2.IDPERFILB; 

Sie die letzte Bedingung entfernen, wenn Sie beiden Paare in der Tabelle amizade wollen.

Sie können auch erzwingen, dass ein bestimmtes Paar nur einmal in die Tabelle amizade geht. Wenn ja, können Sie dies mit einem eindeutigen Index und eine Check-Einschränkung:

alter table amizade constraint chk_amizade_idperfilA_idperfilB 
    check (idperfilA < idperfilB); 

alter table amizade constraint unq_amizade_idperfilA_idperfilB 
    unique (idperfilA, idperilB); 

Diese beiden Kontrollen wird sichergestellt, dass die Freundschaft Paare eindeutig sind. Hinweis: Sie müssen vorsichtig sein, wie Sie die Daten einfügen.

0
INSERT INTO AMIZADE (IDPERFILA, 
       IDPERFILB, 
       DATA) 
SELECT a.IDPERFILA, a.IDPERFILB, a.DATA 
FROM LIKES as a, LIKES as b 
WHERE (a.IDPERFILB = b.IDPERFILA AND a.IDPERFILA = b.IDPERFILB) 
**and (a.IDPrfila > a.IDPerfilb)** 

fügen Sie einfach die Anweisung zwischen ** und arbeitete. Danke für die Tipps

Verwandte Themen