Доступ к SQL-запросу соединения соответствует двум подходящим соединенным строкам - PullRequest
0 голосов
/ 15 мая 2018

Данные таблицы:

tblGuardian
| ID | FirstName | LastName |
|----|-----------|----------|
|  1 |       Sam |    Smith |
|  2 |      John |    Jones |
|  3 |      Jack |    Black |
|  4 |      Jane |      Doe |

tblChild
| ID | FirstName | LastName | Sex |                  DOB | GuardianID |
|----|-----------|----------|-----|----------------------|------------|
|  1 |      Sara |    Smith |   F | 2010-01-01T00:00:00Z |          1 |
|  2 |      Dave |    Smith |   M | 2008-03-01T00:00:00Z |          1 |
|  3 |      Mike |    Jones |   M | 2009-06-01T00:00:00Z |          2 |
|  4 |      Fred |    Jones |   M | 2010-07-01T00:00:00Z |          2 |
|  5 |     Sally |    Black |   F | 2011-11-01T00:00:00Z |          3 |
|  6 |     Harry |      Doe |   M | 2007-07-01T00:00:00Z |          4 |
|  7 |      Kate |      Doe |   F | 2008-04-01T00:00:00Z |          4 |

Что будет возвращать SQL-запрос Access:

  1. все опекуны и дети их детей
  2. , у которых есть по крайней мере одна девочка и один ребенок мужского пола

Я бы хотел, чтобы результат выглядел следующим образом:

| Firstname | LastName | Child FirstName |       DOB  |
|-----------|----------|-----------------|------------|
|       Sam |    Smith |            Sara | 2010-01-01 |
|       Sam |    Smith |            Dave | 2008-03-01 |
|      Jane |      Doe |           Harry | 2007-07-01 |
|      Jane |      Doe |            Kate | 2008-04-01 | 

У меня есть этот запрос MS SQL, который работает:

SELECT g1.FirstName, g1.LastName, c1.FirstName, c1.DOB FROM
tblGuardian g1 INNER JOIN tblChild c1 ON g1.ID = c1.GuardianID
WHERE g1.ID in (
SELECT g.ID
FROM tblGuardian g INNER JOIN tblChild c ON c.GuardianID = g.ID
GROUP BY g.ID
HAVING Count(Distinct c.Sex) = 2
)

Теперь мне нужно преобразовать это в MS Access!

Access SQL не принимает Count (Distinct ...).

Ответы [ 3 ]

0 голосов
/ 15 мая 2018

Благодаря Фаму X. Баху, решение, которое сработало:

SELECT g1.FirstName, g1.LastName, c1.FirstName, c1.DOB FROM
tblGuardian g1 INNER JOIN tblChild c1 ON g1.ID = c1.GuardianID
WHERE g1.ID in (
SELECT g.ID
FROM tblGuardian g INNER JOIN tblChild c ON c.GuardianID = g.ID
GROUP BY g.ID
HAVING SUM(IIF(c.Sex="M",1,0))>0 AND SUM(IIF(c.Sex="F",1,0))>0
)
0 голосов
/ 15 мая 2018

Я думаю, что лучший подход в обеих базах выглядит примерно так:

SELECT g.FirstName, g.LastName, c.FirstName, c.DOB
FROM tblGuardian as g INNER JOIN
     tblChild as c
     ON g.ID = c.GuardianID
WHERE EXISTS (SELECT 1 FROM tblChild as c2 WHERE c2.GuardianID = g.ID AND c2.Sex = "F") AND
      EXISTS (SELECT 1 FROM tblChild as c2 WHERE c2.GuardianID = g.ID AND c2.Sex = "M");

Эта конкретная версия будет работать в обеих базах данных, за исключением кавычек вокруг констант даты.

0 голосов
/ 15 мая 2018

Вы должны иметь возможность изменить свою логику на что-то вроде

Sum (case when male then 1 else 0) > 0
and 
Sum (Case when female then 1 else 0) > 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...