MS Access SQL - слева Присоединиться к таблице, которая имеет только уникальные совпадения - PullRequest
0 голосов
/ 30 августа 2018

Я использую пример базы данных, которую я получил через DBeaver. Он содержит таблицу с именем Artists и таблицу с названием Albums. У некоторых артистов нет альбомов, у некоторых есть один, а у других их много.

То, чего я пытаюсь добиться, - это объединение влево, чтобы показать всех исполнителей, но отобразить только имя альбома исполнителей, у которых только один альбом.

Следующее работает с использованием DBeaver, но не работает, если выполняется непосредственно из MS Access (что мне нужно сделать):

SELECT
ar.AName,
al.title
FROM
Artist ar
LEFT JOIN (
SELECT
    al.*
FROM
    album al
INNER JOIN (
    SELECT
        artistid,
        COUNT( artistid ) artistCount
    FROM
        album
    GROUP BY
        artistid ) alc ON
    alc.artistid = al.artistid
    AND alc.artistcount = 1 ) al ON
al.artistid = ar.artistid
ORDER BY
ar.aname

Таблицы имеют следующие столбцы:

Artist
    ArtistID (Key)
    Name

Album
    AlbumID (Key)
    Title
    ArtistID

Большое спасибо заранее. Я не могу найти ответ на это нигде. Я понимаю, что версия SQL, используемая в MS Access, не такая, как в других вариантах

Приветствия

Patrick

Ответы [ 3 ]

0 голосов
/ 30 августа 2018

Вы не хотите left join. Если у исполнителя ровно один альбом, тогда будет работать обычный join. Ключ агрегации:

select ar.aname, max(al.title) as title
from artist as ar inner join
     album as al
     on ar.artistid = al.artistid
group by ar.artistid, ar.aname  -- I supposed two artists could have the same name
having count(*) = 1;

Основная идея заключается в том, что если существует только один альбом, то max(al.title) возвращает название этого альбома.

РЕДАКТИРОВАТЬ: (на основе комментария)

select ar.aname,
       switch(al.artistid is null, "No album"
              count(*) = 1, max(al.title),
              1=1, "> 1"
             ) as album_title
from artist as ar left join
     album as al
     on ar.artistid = al.artistid
group by ar.artistid, ar.aname;
0 голосов
/ 30 августа 2018

Спасибо за вашу помощь. Мне удалось получить результаты, которые я ожидал, используя SQL в MS Access (нужно будет проверить его на 100%).

Я использовал следующее:

SELECT
    ar.AName,
    al.title
FROM
    Artist ar
LEFT JOIN (
    SELECT
        al.*
    FROM
        album al,
        (
        SELECT
            al1.artistid,
            COUNT( al1.artistid ) AS al1Count
        FROM
            album al1
        GROUP BY
            al1.artistid ) al1
    WHERE
        al.artistID = al1.artistid
        AND al1.al1count = 1 ) al ON
    al.artistid = ar.artistid
ORDER BY
    ar.aname

Еще раз спасибо!

0 голосов
/ 30 августа 2018

Я бы пошел с NOT EXISTS:

SELECT a.ArtistID, a.Name, al.Title
FROM Artist a LEFT JOIN
     Album al
     ON al.ArtistID = a.ArtistID AND 
        NOT EXISTS (SELECT 1 
                    FROM Album al1 
                    WHERE al1.ArtistID = al.ArtistID AND a1l.AlbumID <> al.AlbumID
                   );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...