我在SQL中没有正确的答案

时间:2017-12-03 20:22:47

标签: sql

列出项目编号(PR_NO),这些项目编号仅接收存储在(P_CITY)与项目相同城市的部分的项目(显示查询的输出)。

表:EMP 主键:E_NO

E_NO    E_NAME  E_RATE  E_DEPT
1          A    $400.00 
2          B    $200.00   1
3          C    $150.00   2
4          D    $150.00   3
5          E    $120.00   1
6          F    $100.00   1
7          G    $100.00   2
8          H    $50.00    2
9          I    $50.00    3
10         J    $50.00    3
11         K    $150.00   3

表:PART 主键:P_NO

P_NO    P_NAME  P_CITY
1         P1    NY
2         P2    NY
3         P3    LA
4         P4    SF
5         P5    LA
6         P6    NY

表:PROJECT 主键:PR_NO

PR_NO   PR_MGR  PR_DEPT PR_LOC
1           2         1     NY
2           3         2     LA
3           2         1     NY

表:供应商 主键:S_NO

S_NO    S_NAME  S_LOC
1          S1    NY
2          S2    NY
3          S3    LA

表:供应

Primary Key: P_NO + PR_NO + S_NO
Foreign Key: P_NO references PART
Foreign Key: PR_NO references PROJECT
Foreign Key: S_NO references SUPPLIER

P_NO    PR_NO   S_NO    QTY
1          1    1       111
1          1    2       112
1          1    3       113
1          2    1       121
1          2    2       122
1          2    3       123
1          3    1       131
1          3    2       132
1          3    3       133
2          1    1       211
3          1    1       311
4          1    1       411
5          1    1       511
6          1    1       611

表:工作

Primary Key: E_NO + PR_NO
Foreign Key: E_NO references EMP
Foreign Key: PR_NO references PROJECT
E_NO    PR_NO   HRS
2          1    10
3          2    20
5          1    20
5          2    20
5          3    20
6          1    10
6          2    10



select distinct P.PR_NO
from PROJECT P, PART PA
where PA.P_CITY = P.PR_LOC;

正确的答案问题应该是:

PR_NO
3

这是错误:

PR_NO
    1
    3
    2

3 个答案:

答案 0 :(得分:1)

为了完成此任务,您还需要使用Supply表,如下所示:

select s.pr_no
from supply s
inner join part p
on p.p_no = s.p_no
group by s.pr_no
having max(p.p_city) = min(p.p_city)
and    min(p.p_city) = (select pr_loc
                        from project
                        where pr_no = s.pr_no
                       )

答案 1 :(得分:0)

您的查询中的主要问题是您应该在过滤之前正确加入2个表PROJECT和PART;所以在这种情况下你应该使用表SUPPLY。

SELECT DISTINCT S.PR_NO
  FROM SUPPLY S
  INNER JOIN PROJECT PR
  ON S.PR_NO = PR.PR_NO
  INNER JOIN PART P
  ON S.P_NO = P.P_NO
  WHERE PR.PR_LOC = P.P_CITY
  AND S.PR_NO NOT IN ( SELECT DISTINCT S.PR_NO
                         FROM SUPPLY S
                         INNER JOIN PROJECT PR
                         ON S.PR_NO = PR.PR_NO
                         INNER JOIN PART P
                         ON S.P_NO = P.P_NO
                         WHERE PR.PR_LOC <> P.P_CITY );

希望这有帮助!

答案 2 :(得分:0)

我使用您的示例数据测试了此查询,并按预期返回项目#3:

SELECT DISTINCT S.PR_NO
FROM
    SUPPLY S
    INNER JOIN PROJECT PR
        ON S.PR_NO = PR.PR_NO
    INNER JOIN PART P
        ON S.P_NO = P.P_NO
WHERE
    PR.PR_LOC = P.P_CITY AND
    NOT S.PR_NO IN
        (
            SELECT S2.PR_NO
            FROM
                SUPPLY S2
                INNER JOIN PROJECT PR2
                    ON S2.PR_NO = PR2.PR_NO
                INNER JOIN PART P2
                    ON S2.P_NO = P2.P_NO
            WHERE PR2.PR_LOC <> P2.P_CITY
        )

SUPPLY表创建PART和PROJECT之间的链接。主查询查找与项目存储在同一城市的零件。 where子句中的子选择看起来几乎相同,只是它查找存储在不同城市中的部件。具有此类城市的项目将被NOT S.PR_NO IN (...)排除。