1

你能告诉我这是否正确,或者我是否需要改进其中的一些,当有关联实体时,我很难理解查询。

ERD

列出所有捐赠者

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

4 回答 4

2

在您的 ERD 中,您可能希望在 GIFT 表上放置一个主键。如果每个捐赠者每年只有一份礼物,那么主键可能是 DONOR 和 YEAR。否则添加人工密钥将是一个好主意。

列出 106 和 125 号捐助者的电话号码 - 我认为您想在 WHERE 子句中使用不同的字段。您应该找到这些捐赠者的电话号码 (dphone),但捐赠者 ID 不是电话号码。

列出每年进行捐赠的捐赠者——我认为您的查询不会如您所愿。解决这个问题的一种方法是制作一份捐赠者名单和他们捐赠的年份,然后找出他们没有捐赠的年份。在“他们没有捐赠的年份”列表中没有任何条目的捐赠者将是每年捐赠的捐赠者。提示:涉及使用外连接。

分享和享受。

于 2010-08-06T16:32:23.400 回答
2

每年捐赠的捐赠者(警告:未经测试):

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));

(假设 GIFT 中的一行表示进行了捐赠,即该金额始终 > 0)

于 2010-08-06T16:34:48.547 回答
1

更正的查询:

列出 106 和 125 号捐赠者的电话号码

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

列出每个捐助者每年提供的金额

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

列出每年进行捐赠的捐赠者

应该澄清这一点:“每年”是什么意思?

于 2010-08-06T16:19:47.353 回答
1

列出每年进行捐赠的捐赠者

    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
于 2010-08-06T16:26:44.233 回答