ERD и SQL запрос помогают? - PullRequest
1 голос
/ 06 августа 2010

Можете ли вы сказать мне, если это сделано правильно, или если мне нужно улучшить некоторые из них, мне трудно понять запрос, когда существует ассоциативная сущность.

ERD http://img706.imageshack.us/img706/3796/newbitmapimageun.jpg

Список всех доноров

SELECT* from Donor;

Укажите имена и фамилии всех доноров

SELECT dfname, dlname
FROM donor

Список телефонов доноров № 106 и 125

SELECT dphone
FROM DONOR 
WHERE dphone = “106” 
AND dphone = “125”; 

Укажите сумму, указанную каждым донором за каждый год

SELECT year 
FROM YEAR IN (
SELECT donor, amount
FROM GIFT);

Список доноров, которые делали пожертвования каждый год

SELECT dfname, dlname 
FROM DONOR
WHERE IN( SELECT * FROM 
YEAR)
AND amount != null;

Перечислите имена доноров, которые живут в Грузии или Северной Каролине

SELECT dfname, dlname
FROM donor
WHERE state = “GA” 
OR  state = “NC”;

Перечислите имена доноров, чья фамилия Уильямс и которые живут в Афинах, Джорджия

SELECT dfname, dlname 
FROM donor 
WHERE dlname = “Williams”
AND city = “Athens”
AND state = “GA”;

Я хотел бы поблагодарить всех, кто помог, и я хотел бы поставить каждому зеленую галочку, так как все ответы предоставили решение. Я ценю помощь и, возможно, однажды смогу ответить на вопрос, который у вас может возникнуть в будущем.

Ответы [ 4 ]

2 голосов
/ 06 августа 2010

Доноры, которые сделали пожертвование каждый год (предостережение: не проверено):

SELECT dfname, dlname
FROM   DONOR
WHERE NOT EXISTS 
   (SELECT * FROM YEAR WHERE NOT EXISTS 
      (SELECT * FROM GIFT WHERE year = YEAR.year AND donor = DONOR.donor));

(Предполагая, что строка в ПОДАРОК ​​означает, что было сделано пожертвование, т.е. эта сумма> 0 всегда)

2 голосов
/ 06 августа 2010

В вашем ERD вы можете захотеть поместить первичный ключ в вашу таблицу GIFT. Если на одного донора дается только один дар в год, то первичным ключом могут быть DONOR и YEAR. В противном случае было бы неплохо добавить искусственный ключ.

Укажите номера телефонов доноров с номерами 106 и 125 - я думаю, что вы хотите использовать другое поле в предложении WHERE. Вы должны найти номер телефона этих доноров (dphone), но идентификатор донора не является номером телефона.

Перечислите доноров, которые делали пожертвования каждый год - я не думаю, что ваш запрос будет делать то, что вы хотите. Для этого можно составить список доноров и их лет, а затем найти годы, которые они не дали. Доноры, у которых нет никаких записей в списке «лет, которые они не дали», будут те, которые дают каждый год. Подсказка: включает в себя использование внешних объединений.

Делись и наслаждайся.

1 голос
/ 06 августа 2010

Перечислите доноров, которые сделали пожертвование каждый год

    Select dfname, dlastName 
     from
    Donor d
    INNER JOIN 
    (SELECT Donor, count(year) cyear
    FROM DONOR d
    INNER JOIN gift g
    on d.donor = g.donor
    GROUP BY donor
) donorYear
    ON d.donor = donorYear.donor
    INNER JOIN 
    (SELECT count(year) cyear
    from Year) years
    on years.cyear = donarYear.cyear
1 голос
/ 06 августа 2010

исправлено запросов:

Укажите номера телефонов доноров № 106 и 125

SELECT dphone
FROM DONOR 
WHERE donor in (106, 125)

Укажите сумму, указанную каждым донором за каждый год

SELECT donor, year, sum(amount) as amount
FROM gift
group by donor, year

Перечислите доноров, которые делали пожертвования каждый год

Это следует уточнить: что означает "каждый год"?

...