Creazione di self-join in modo manuale (Visual Database Tools)Create Self-Joins Manually (Visual Database Tools)

È possibile unire in join una tabella con se stessa anche se questa non ha una relazione riflessiva nel database.You can join a table to itself even if the table does not have a reflexive relationship in the database. È ad esempio possibile utilizzare un self-join per individuare coppie di autori che risiedono nella stessa città.For example, you can use a self-join to find pairs of authors living in the same city.

Come per tutti i tipi di join, un self-join richiede almeno due tabelle,As with any join, a self-join requires at least two tables. con la differenza che, anziché aggiungere una seconda tabella alla query, si aggiungerà una seconda istanza della stessa tabella.The difference is that, instead of adding a second table to the query, you add a second instance of the same table. Sarà così possibile confrontare una colonna nella prima istanza della tabella con la stessa colonna nella seconda istanza, in modo da confrontare fra loro i valori contenuti in una colonna.That way, you can compare a column in the first instance of the table to the same column in the second instance, which allows you to compare the values in a column to each other. In Progettazione query e Progettazione viste verrà assegnato un alias alla seconda istanza della tabella.The Query and View Designer assigns an alias to the second instance of the table.

Se ad esempio si crea un self-join per trovare tutte le coppie di autori di Berkeley, verrà confrontata la colonna city nella prima istanza della tabella con la colonna city nella seconda istanza.For example, if you are creating a self-join to find all pairs of authors within Berkeley, you compare the city column in the first instance of the table against the city column in the second instance. La query risultante potrebbe essere analoga alla seguente:The resulting query might look like the following:

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

La creazione di un self-join spesso richiede più condizioni di join.Creating a self-join often requires multiple join conditions. Il risultato della query precedente può essere utile per comprenderne la motivazione:To understand why, consider the result of the preceding query:

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.The first row is useless; it indicates that Cheryl Carson lives in the same city as Cheryl Carson. Altrettanto inutile è la seconda riga.The second row is equally useless. Per eliminare questi dati inutili, è possibile aggiungere un'altra condizione che consenta di conservare solo i risultati in cui i due nomi identificano autori diversi.To eliminate this useless data, you add another condition retaining only those result rows in which the two author names describe different authors. La query risultante sarà analoga alla seguente:The resulting query might look like this:

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

Il set di risultati è migliorato:The result set is improved:

Cheryl Carson       Abraham Bennet  
   Abraham Bennet      Cheryl Carson  

Le due righe di risultati, tuttavia, sono ridondanti.But the two result rows are redundant. La prima dice che Carson vive nella stessa città di Bennet e la seconda dice che Bennet vive nella stessa città di Carson.The first says Carson lives in the same city as Bennet, and the second says the Bennet lives in the same city as Carson. Per eliminare questa ridondanza, è possibile modificare la seconda condizione di join da "non uguale" a "minore di".To eliminate this redundancy, you can alter the second join condition from "not equals" to "less than." La query risultante sarà analoga alla seguente:The resulting query might look like this:

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

Si otterrà così un set di risultati analogo al seguente:And the result set looks like this:

Cheryl Carson       Abraham Bennet  

Per creare manualmente un self-joinTo create a self-join manually

  1. Aggiungere la tabella o l'oggetto con valori di tabella al riquadro Diagramma .Add to the Diagram pane the table or table-valued object you want to work with.

  2. Aggiungere nuovamente la stessa tabella o lo stesso oggetto con valori di tabella in modo che venga visualizzato due volte nel riquadro Diagramma.Add the same table again, so that the Diagram pane shows the same table or table-valued object twice within the Diagram pane.

    Un alias verrà assegnato alla seconda istanza aggiungendo un numero sequenziale al nome della tabella.The Query and View Designer assigns an alias to the second instance by adding a sequential number to the table name. Verrà inoltre inserita una linea di join tra le due occorrenze della tabella o dell'oggetto con valori di tabella all'interno del riquadro Diagramma.In addition, the Query and View Designer creates a join line between the two occurrences of the table or table-valued object within the Diagram pane.

  3. Fare clic con il pulsante destro del mouse sulla linea di join e scegliere Proprietà dal menu di scelta rapida.Right-click the join line and choose Properties from the shortcut menu.

  4. Nella finestra Proprietà fare clic su Condizione e tipo di join e sui puntini di sospensione (…) a destra della proprietà.In the Properties window click Join Condition and Type and click the ellipses (…) to the right of the property.

  5. Nella finestra di dialogo Join cambiare l'operatore di confronto tra le chiavi primarie secondo necessità.In the Join Dialog Box change the comparison operator between the primary keys as required. È ad esempio possibile modificare l'operatore minore di (<).For example, you might change the operator to less than (<).

  6. Creare l'altra condizione di join, ad esempio authors.zip = authors1.zip, trascinando il nome della colonna join primaria nella prima occorrenza della tabella o dell'oggetto con valori di tabella e rilasciandolo sulla colonna corrispondente nella seconda occorrenza.Create the additional join condition (for example, authors.zip = authors1.zip) by dragging the name of the primary join column in the first occurrence of the table or table-valued object and dropping it on the corresponding column in the second occurrence.

  7. Specificare le altre opzioni per la query, quali le colonne di output, le condizioni di ricerca e il criterio di ordinamento.Specify other options for the query such as output columns, search conditions, and sort order.

Vedere ancheSee Also

Creare self-join in modo automatico (Visual Database Tools)Create Self-Joins Automatically (Visual Database Tools)
Esecuzione di query con join (Visual Database Tools)Query with Joins (Visual Database Tools)