【问题标题】:ERD and SQL query assistance?ERD 和 SQL 查询帮助?
【发布时间】:2010-08-06 16:11:29
【问题描述】:

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

列出所有捐赠者

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

列出姓氏为 Williams 且居住在乔治亚州雅典的捐赠者的姓名

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

我要感谢所有提供帮助的人,我希望我能给每个人一个绿色的复选标记,因为输入的所有答案都提供了解决方案。感谢您的帮助,也许有一天我可以为您将来可能遇到的问题提供帮助。

【问题讨论】:

  • 第三个中AND应该是OR。此外,WHERE 子句中的这两个比较应该针对主键而不是dphone
  • 感谢大家的帮助,非常感谢。

标签: sql mysql oracle postgresql erd


【解决方案1】:

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

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)

【讨论】:

  • 在 MySQL 5.1 上测试和工作。思路是这样的:如果捐赠者每年都进行捐赠,那么就没有捐赠者不捐赠的年份。因此这两个 NOT EXISTS 子查询。
【解决方案2】:

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

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

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

分享和享受。

【讨论】:

    【解决方案3】:

    更正的查询:

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

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

    列出每个捐赠者每年给予的金额

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

    列出每年捐赠的捐赠者

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

    【讨论】:

      【解决方案4】:

      列出每年捐赠的捐赠者

          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-10-20
        • 1970-01-01
        • 2016-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多