【问题标题】:SQL select using join使用连接的 SQL 选择
【发布时间】:2017-09-30 12:46:42
【问题描述】:

我有一张叫做 ROOM 的桌子。

CONSTRAINT ROOM_PK PRIMARY KEY(BUILDINGNO,ROOMNO),
CONSTRAINT ROOM_FK1 FOREIGN KEY(BUILDINGNO) REFERENCES BUILDING(BUILDINGNO));


BUILDINGNO | ROOMNO | ROOMCAPACITY
-----------+--------+-------------
B1         | R1     | 121
B1         | R2     | 253
B2         | R1     | 275
B2         | R2     | 126
B2         | R3     | 124
B3         | R1     | 256    
B3         | R2     | 324
B4         | R1     | 431
B4         | R2     | 345
B4         | R3     | 231

还有一个名为 SESSION 的表。

CONSTRAINT SESSION_PK PRIMARY KEY(SESSIONID),
CONSTRAINT SESSION_FK1 FOREIGN KEY(BUILDINGNO) REFERENCES 
BUILDING(BUILDINGNO),
CONSTRAINT SESSION_FK2 FOREIGN KEY(BUILDINGNO,ROOMNO) REFERENCES 
ROOM(BUILDINGNO,ROOMNO),
CONSTRAINT SESSION_FK3 FOREIGN KEY(SPEAKERID) REFERENCES SPEAKER(SPEAKERID)); 


SESSIONID | BUILDINGNO | ROOMNO | SPEAKERID
----------+------------+--------+----------
SS01      | B1         | R1     | S1
SS02      | B2         | R1     | S2
SS03      | B1         | R2     | S2
SS04      | B4         | R2     | S4
SS05      | B3         | R2     | S5
SS06      | B3         | R1     | S5
SS07      | B4         | R2     | S3
SS08      | B1         | R2     | S2
SS09      | B2         | R3     | S4
SS10      | B4         | R1     | S3

我想使用 JOIN 创建一个 SELECT 语句,该语句显示不在 BUILDINGNO 'B2' 中的 SESSION(ID、BUILDINGNO 和 ROOMNO)的详细信息,并且 ROOMCAPACITY 必须 > 180。结果也排除重复值.

我尝试使用语句:

SELECT DISTINCT CONFERENCESESSION.SESSIONID, CONFERENCESESSION.BUILDINGNO, CONFERENCESESSION.ROOMNO 
FROM CONFERENCESESSION 
INNER JOIN ROOM ON ROOM.ROOMNO=CONFERENCESESSION.ROOMNO 
WHERE CONFERENCESESSION.BUILDINGNO != 'B2' 
AND ROOM.ROOMCAPACITY >= '180';

但是这不太对...有人可以告诉我如何解决这个问题吗?

【问题讨论】:

  • ROOMCAPACITY 的数据类型是什么?你的问题是什么?
  • 您应该在BUILDINGNOROOMNO 列上加入表格。
  • 我认为CONSTRAINT SESSION_FK1 FOREIGN KEY(BUILDINGNO) REFERENCES BUILDING(BUILDINGNO), FK 没有多大用处,因为SESSION_FK2 在两个(BUILDINGNO,ROOMNO) 列上都有。
  • 感谢您的提示!我会做出改变:)

标签: sql database oracle select join


【解决方案1】:

您需要JOINBUILDINGNOROOMNO 列上的表。假设ROOMCAPACITYint

SELECT DISTINCT CS.SESSIONID, 
                CS.BUILDINGNO, 
                CS.ROOMNO 
FROM 
CONFERENCESESSION CS
INNER JOIN 
ROOM R
ON R.BUILDINGNO = CS.BUILDINGNO
AND R.ROOMNO     = CS.ROOMNO 
WHERE
CS.BUILDINGNO != 'B2' 
AND R.ROOMCAPACITY >= 180;

【讨论】:

    【解决方案2】:

    需要使用整个外键

    SELECT DISTINCT CONFERENCESESSION.SESSIONID, CONFERENCESESSION.BUILDINGNO, CONFERENCESESSION.ROOMNO 
    FROM CONFERENCESESSION 
    INNER JOIN ROOM 
      ON ROOM.BUILDINGNO = CONFERENCESESSION.BUILDINGNO
      ON ROOM.ROOMNO     = CONFERENCESESSION.ROOMNO 
     AND CONFERENCESESSION.BUILDINGNO != 'B2' 
     AND ROOM.ROOMCAPACITY >= '180';
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-18
      • 2019-11-27
      • 1970-01-01
      • 2015-06-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多