【发布时间】:2017-01-25 22:57:48
【问题描述】:
所以我有一张名为 Mroom 的桌子,看起来像这样:
CREATE Mroom(ID_ROOM NUMBER(3), CHAR_NAME NVARCHAR2(30), CHAR_VALUE NUMBER(20));
表格的内容类似于:
1;冷气机; 1
1;水池; 2
2;水池; 1
这意味着 ID 为 1 的房间有 1 台空调和 2 个游泳池。 ID 2 的房间有一个游泳池。 我还创建了一个数据类型的表,我称之为 c_chars:
CREATE OR REPLACE TYPE c_chars FORCE IS OBJECT (CHAR VARCHAR2(20), VALUE NUMBER(30));
/
CREATE OR REPLACE TYPE tab_chars FORCE IS TABLE OF c_chars;
/
而且我需要知道例如是否有任何房间至少有 1 台空调和一个游泳池。我当前的代码:
CREATE OR REPLACE PROCEDURE thisRoomOK(v_carateristicas IN tab_chars, lista OUT SYS_REFCURSOR)
IS BEGIN
OPEN lista FOR SELECT MRoom.ID_ROOM
FROM Mroom, TABLE(v_carateristicas) v_carateristicas
WHERE Mroom.CHAR_NAME = v_carateristicas.CHAR
AND Mroom.VALUE >= v_carateristicas.VALUE
GROUP BY Mroom.ID_ROOM
ORDER BY getSalas.Mroom.ID_ROOM;
END;
/
问题是如果我要求的房间至少有一个空调和一个游泳池。它将返回我两个房间,因为 rrom 2 有一个游泳池(它像 OR 一样工作,但我希望它像 AND 一样工作)。 p>
编辑 1:
如果可能的话,我希望收到改变程序的答案,但不是表格,尽管欢迎所有答案!
编辑 2:
上面的代码是简化的,这是完整的代码:
对象定义:
CREATE OR REPLACE TYPE c_valor FORCE IS OBJECT (CARATERISTICA VARCHAR2(20), VALOR NUMBER(30));
/
CREATE OR REPLACE TYPE tabc_valor FORCE IS TABLE OF c_valor;
/
程序:
CREATE OR REPLACE PROCEDURE getSalas_Carateristicas(v_carateristicas IN tabc_valor, lista OUT SYS_REFCURSOR)
IS BEGIN
OPEN lista FOR SELECT getSalas.ID_SALA
FROM getSalas, TABLE(v_carateristicas) v_carateristicas
WHERE getSalas.NOME_CARATERISTICA = v_carateristicas.CARATERISTICA
AND getSalas.VALOR >= v_carateristicas.VALOR
GROUP BY getSalas.ID_SALA
ORDER BY getSalas.ID_SALA;
END;
/
根据@XING的建议修改程序:
CREATE OR REPLACE PROCEDURE getSalas_Carateristicas(v_carateristicas IN tabc_valor, lista OUT SYS_REFCURSOR)
IS BEGIN
OPEN lista FOR SELECT getSalas.ID_SALA
FROM getSalas
INNER JOIN TABLE(v_carateristicas) v_carateristicas ON getSalas.NOME_CARATERISTICA = v_carateristicas.CARATERISTICA
AND getSalas.VALOR >= v_carateristicas.VALOR
GROUP BY getSalas.ID_SALA
ORDER BY getSalas.ID_SALA;
END;
/
【问题讨论】:
-
看来您需要在
group by之后添加having子句 - 如果您正在寻找两个特征(空调和游泳池),您需要having count(*) = 2。也就是说,将为该房间选择两行:第一行是因为它至少具有所需数量的空调,第二行是因为它至少具有所需数量的游泳池。一般来说,2应该是tab_chars中的特征数(?“字符”)。 -
@mathguy。放有并不能解决问题。问题取决于 OP 如何要求房间。他传递的所有价值观。
-
@mathguy,你是什么意思?
-
@Safirah ..你的问题没有解决,你按照我说的方法试过了吗。
-
@XING,是的,我试过了,但没用,chat.stackoverflow.com/rooms/134070/…
标签: sql oracle stored-procedures plsql