Dela via


Skapa frågor med något utöver en tabell (Visual Database Tools)

gäller för:SQL Server

När du skriver en hämtningsfråga formulerar du vilka kolumner du vill ha, vilka rader du vill ha och var frågeprocessorn ska hitta de ursprungliga data. Vanligtvis består dessa ursprungliga data av en tabell eller flera tabeller som är sammanfogade. Men de ursprungliga data kan komma från andra källor än tabeller. I själva verket kan det komma från vyer, frågor, synonymer eller användardefinierade funktioner som returnerar en tabell.

Använda en vy i stället för en tabell

Du kan välja rader från en vy. Anta till exempel att databasen innehåller en vy med namnet "ExpensiveBooks", där varje rad beskriver en rubrik vars pris överstiger 19,99. Vydefinitionen kan se ut något så här:

SELECT *
FROM titles
WHERE price > 19.99;

Du kan välja de dyra psykologiböckerna bara genom att välja psykologiböckerna från ExpensiveBooks-vyn. Den resulterande SQL-filen kan se ut så här:

SELECT *
FROM ExpensiveBooks
WHERE type = 'psychology';

På samma sätt kan en vy delta i en JOIN åtgärd. Du kan till exempel hitta försäljningen av dyra böcker genom att bara ansluta försäljningstabellen till vyn ExpensiveBooks. Den resulterande SQL-filen kan se ut så här:

SELECT *
FROM sales
     INNER JOIN ExpensiveBooks
         ON sales.title_id = ExpensiveBooks.title_id;

Mer information om hur du lägger till en vy i en fråga finns i Lägga till tabeller i frågor (Visual Database Tools).

Använda en fråga i stället för en tabell

Du kan välja rader från en fråga. Anta till exempel att du redan har skrivit en sökfråga som hämtar titlar och identifierare för de medförfattade böckerna – det vill säga böckerna med fler än en författare. SQL kan se ut så här:

SELECT titles.title_id,
       title,
       type
FROM titleauthor
     INNER JOIN titles
         ON titleauthor.title_id = titles.title_id
GROUP BY titles.title_id, title, type
HAVING COUNT(*) > 1;

Du kan sedan skriva en annan fråga som bygger på det här resultatet. Du kan till exempel skriva en fråga som hämtar de psykologiböcker som har medförfattare. Om du vill skriva den här nya frågan kan du använda den befintliga frågan som källa för den nya frågans data. Den resulterande SQL-filen kan se ut så här:

SELECT title
FROM (SELECT titles.title_id,
             title,
             type
      FROM titleauthor
           INNER JOIN titles
               ON titleauthor.title_id = titles.title_id
      GROUP BY titles.title_id, title, type
      HAVING COUNT(*) > 1) AS co_authored_books
WHERE type = 'psychology';

Den framhävde texten visar den befintliga frågan som används som källa för den nya frågans data. Den nya frågan använder ett alias ("co_authored_books") för den befintliga frågan. Mer information om alias finns i Skapa tabellalias (Visual Database Tools) och Skapa kolumnalias (Visual Database Tools).

På samma sätt kan en fråga delta i en JOIN åtgärd. Du kan till exempel hitta försäljningen av dyra medförfattade böcker endast genom att ansluta vyn ExpensiveBooks till frågan som hämtar de medförfattade böckerna. Den resulterande SQL-filen kan se ut så här:

SELECT
    ExpensiveBooks.title
FROM
    ExpensiveBooks
        INNER JOIN
        (
        SELECT
            titles.title_id,
            title,
            type
        FROM
            titleauthor
                INNER JOIN
                titles
                ON titleauthor.title_id
                =  titles.title_id
        GROUP BY
            titles.title_id,
            title,
            type
        HAVING COUNT(*) > 1
        )

Mer information om hur du lägger till en fråga i en fråga finns i Lägga till tabeller i frågor (Visual Database Tools).

Använda en användardefinierad funktion i stället för en tabell

Du kan skapa en användardefinierad funktion som returnerar en tabell. Sådana funktioner är användbara för att utföra komplex eller procedurmässig logik.

Anta till exempel att tabellen employee innehåller ytterligare en kolumn, employee.manager_emp_id, och att det finns en sekundärnyckel från manager_emp_id till employee.emp_id. I varje rad i tabellen manager_emp_id med anställda anger kolumnen den anställdes chef. Mer exakt anger det medarbetarens chefs emp_id. Du kan skapa en användardefinierad funktion som returnerar en tabell som innehåller en rad för varje anställd som arbetar inom en viss chef på hög nivås organisationshierarki. Du kan anropa funktionen fn_GetWholeTeam och utforma den för att ta en indatavariabel – den emp_id chef vars team du vill hämta.

Du kan skriva en fråga som använder funktionen fn_GetWholeTeam som datakälla. Den resulterande SQL-filen kan se ut så här:

SELECT *
FROM fn_GetWholeTeam('VPA30890F');

VPA30890F är den emp_id chef vars organisation du vill hämta. Mer information om hur du lägger till en användardefinierad funktion i en fråga finns i Lägga till tabeller i frågor (Visual Database Tools). En fullständig beskrivning av användardefinierade funktioner finns i Användardefinierade funktioner.