我正在使用Oracle进行数据库个人学习。根据我目前的知识,我无法解决这个问题......在这里,我将展示我的问题。
这是我的2表结构:
CREATE table "HOSPITAL" (
"HOSPITAL_ID" NUMBER NOT NULL,
"NAME" VARCHAR2(255),
"ADDRESS" VARCHAR2(255),
"BED_CAPACITY" NUMBER,
"CONTACT" NUMBER,
"EMAIL" VARCHAR2(255),
"PAYMENT-SCALE" VARCHAR2(255),
constraint "HOSPITAL_PK" primary key ("HOSPITAL_ID")
);
CREATE table "HOSPITAL_SPECIALIZE" (
"HOSPITAL_ID" NUMBER NOT NULL,
"MATERINITY" VARCHAR2(255),
"ENT" VARCHAR2(255),
"DERMATOLOGY" VARCHAR2(255),
"ORTHOPEDICS" VARCHAR2(255),
constraint "HOSPITAL_SPECIALIZE_PK" primary key ("HOSPITAL_ID")
);
我应该如何编写一个自动检测的SQL,并且只列出医院专门针对1个以上的区域。
这可能在SQL中执行,或者我的表结构可能是错误的吗?
感谢您阅读我的问题,并对我糟糕的解释感到抱歉。
答案 0 :(得分:2)
我看不到这么简单的方法。
所以繁琐的方式是
SELECT *
FROM "HOSPITAL" H
JOIN "HOSPITAL_SPECIALIZE" HS
ON H."HOSPITAL_ID" = HS."HOSPITAL_ID"
WHERE DECODE("MATERINITY", 'YES', 1, 0) +
DECODE("ENT", 'YES', 1, 0) +
DECODE("DERMATOLOGY", 'YES', 1, 0) +
DECODE("ORTHOPEDICS", 'YES', 1, 0) >= 2
答案 1 :(得分:1)
尝试:
SELECT
a.HOSPITAL_ID, a.NAME, b.MATERNITY, b.ENT, b.DERMATOLOGY, b.ORTHOPEDICS
FROM
HOSPITAL AS a
JOIN
HOSPITAL_SPECIALIZE AS b ON a.HOSPITAL_ID = b.HOSPITAL_ID
WHERE
CASE MATERNITY WHEN 'YES' THEN 1 ELSE 0 END
+
CASE ENT WHEN 'YES' THEN 1 ELSE 0 END
+
CASE DERMATOLOGY WHEN 'YES' THEN 1 ELSE 0 END
+
CASE ORTHOPEDICS WHEN 'YES' THEN 1 ELSE 0 END > 1
答案 2 :(得分:1)
你可以通过取消旋转表来实现这一点,但也许你还没有进入你的学习领域。标记此示例(将其保存在某处)并在您了解旋转和取消旋转时返回它。
这是一个非常好的学习机会。正如您所看到的,编写一个相对简单的查询(如您请求的查询)似乎并不容易。在许多情况下,这应该表明可能有更好的数据库设计。在这种情况下,您可能最好还有额外的桌子,仅用于医疗专业。然后,您的“hospital_specialize”表将只有两列,用于医院和专业,以及一对(医院,专业),仅用于当前设计中的“是”值。然后查询会更简单 - 并考虑当业内人士认可更多专业时会发生什么。您只需要在“特殊”表中添加一个或多个值,而不必更改表以添加一个或多个列。
然后,您展示的格式的报告将通过旋转获得!