Condividi tramite


Creare manualmente i self-join (Visual Database Tools)

si applica a:SQL Server

È possibile unire una tabella a se stessa anche se la tabella non ha una relazione riflessiva nel database. Ad esempio, è possibile usare un self-join per trovare coppie di autori che vivono nella stessa città.

Come per qualsiasi join, un self-join richiede almeno due tabelle. La differenza è che, invece di aggiungere una seconda tabella alla query, si aggiunge una seconda istanza della stessa tabella. In questo modo, è possibile confrontare una colonna nella prima istanza della tabella con la stessa colonna nella seconda istanza, che consente di confrontare i valori in una colonna l'uno con l'altro. Gli strumenti di Progettazione query e Progettazione viste (Visual Database Tools) assegnano un alias alla seconda istanza della tabella.

Ad esempio, se si crea un self join per trovare tutte le coppie di autori all'interno di Berkeley, si confronta la city colonna nella prima istanza della tabella con la city colonna nella seconda istanza. La query risultante potrebbe essere simile alla seguente:

SELECT authors.au_fname,
       authors.au_lname,
       authors1.au_fname AS Expr2,
       authors1.au_lname AS Expr3
FROM authors
     INNER JOIN authors AS authors1
         ON authors.city = authors1.city
WHERE authors.city = 'Berkeley';

La creazione di un self-join richiede spesso più condizioni di collegamento. Per comprendere il motivo, considerare il risultato della query precedente:

Cheryl Carson       Cheryl Carson
Abraham Bennet      Abraham Bennet
Cheryl Carson       Abraham Bennet
Abraham Bennet      Cheryl Carson

La prima riga è inutile; indica che Cheryl Carson vive nella stessa città di Cheryl Carson. La seconda riga è altrettanto inutile. Per eliminare questi dati inutili, aggiungere un'altra condizione mantenendo solo le righe di risultato in cui i due nomi di autore descrivono autori diversi. La query risultante potrebbe essere simile alla seguente:

SELECT authors.au_fname,
       authors.au_lname,
       authors1.au_fname AS Expr2,
       authors1.au_lname AS Expr3
FROM authors
     INNER JOIN authors AS authors1
         ON authors.city = authors1.city
        AND authors.au_id <> authors1.au_id
WHERE authors.city = 'Berkeley';

Il set di risultati è stato migliorato:

Cheryl Carson       Abraham Bennet
Abraham Bennet      Cheryl Carson

Le due righe dei risultati sono tuttavia ridondanti. Il primo dice che Carson vive nella stessa città di Bennet, e il secondo dice che Bennet vive nella stessa città di Carson. Per eliminare questa ridondanza, è possibile modificare la seconda condizione di join da "non uguale" a "minore di". La query risultante potrebbe essere simile alla seguente:

SELECT authors.au_fname,
       authors.au_lname,
       authors1.au_fname AS Expr2,
       authors1.au_lname AS Expr3
FROM authors
     INNER JOIN authors AS authors1
         ON authors.city = authors1.city
        AND authors.au_id < authors1.au_id
WHERE authors.city = 'Berkeley';

Il set di risultati sarà simile al seguente:

Cheryl Carson       Abraham Bennet

Creare manualmente un self-join

  1. Aggiungere al riquadro Diagramma (Visual Database Tools) la tabella o l'oggetto con valori di tabella da utilizzare.

  2. Aggiungere di nuovo la stessa tabella, in modo che il riquadro Diagramma mostri due volte lo stesso oggetto o valori di tabella.

    Il Designer di Query e Viste assegna un alias alla seconda istanza aggiungendo un numero sequenziale al nome della tabella. Inoltre, i progettatori di Query e Viste creano una linea di collegamento tra le due istanze della stessa tabella o dello stesso oggetto con valori di tabella all'interno del riquadro Diagramma.

  3. Fare clic con il pulsante destro del mouse sulla riga di unione e scegliere Proprietà dal menu di scelta rapida.

  4. Nella finestra Proprietà selezionare Condizione join e tipo e selezionare i puntini di sospensione (...) a destra della proprietà.

  5. Nella finestra di dialogo Join modificare l'operatore di confronto tra le chiavi primarie in base alle esigenze. Ad esempio, è possibile modificare l'operatore in minore di (<).

  6. Creare la condizione di join aggiuntiva (ad esempio, authors.zip = authors1.zip) trascinando il nome della colonna join primaria della prima occorrenza della tabella o oggetto con valori di tabella e rilasciandolo sulla colonna corrispondente nella seconda occorrenza.

  7. Specificare altre opzioni per la query, ad esempio colonne di output, condizioni di ricerca e ordinamento.