如何通过搜索其子项

时间:2016-10-18 13:29:43

标签: sql oracle

这个问题可能听起来含糊不清,但请耐心等待。

我有几张表,都与某些属性的特征有关,它们是:

属性:包括属性的pty_id,郊区,属性类型和其他地址内容

功能:包括feat_id,feat_name

property_feature :连接属性和功能

列表:包含价格和房产可用性等内容

我想要实现的是,按照郊区标准,房产类型以及房产的特征来搜索房产。我现在遇到的问题是我不知道如何通过许多功能找到该属性。

我现在可以通过郊区搜索,一种类型和一种功能。如果我想通过多个郊区或功能进行搜索,我该如何构建查询?我提供的脚本让你有一个粗略的画面(尽管这项工作可能看起来像是一些不良做法的新手):

SELECT  distinct P.PTY_ID, P.PTY_UNITNUM, P.PTY_STREET, P.PTY_POSTCODE,   
         P.PTY_SUBURB,P.PTY_CITY,P.P_TYPE_ID, 
         T.P_TYPE_NAME,L.SALE_PRICE, L.AVAILABILITY
FROM PROPERTY P
LEFT OUTER JOIN property_type T on P.P_TYPE_ID = T.P_TYPE_ID
LEFT OUTER JOIN listings L on  P.PTY_ID = L.PTY_ID
LEFT OUTER JOIN property_feature R on  R.PTY_ID= P.PTY_ID
LEFT OUTER JOIN feature F on  R.FEAT_ID= F.FEAT_ID
WHERE REGEXP_LIKE (P.PTY_SUBURB,'Clayton')
and f.feat_id = 43 //feature 1
and f.feat_id = 40;//feature 2

如果使用上述查询,我​​将无法获得任何结果。有什么想法吗?

请参阅此查询以获取更多想法:

SELECT P.PTY_ID, P.PTY_UNITNUM, P.PTY_STREET, P.PTY_POSTCODE, 
       P.PTY_SUBURB,P.PTY_CITY, T.P_TYPE_NAME, 
       L.SALE_PRICE, L.AVAILABILITY, R.PTY_ID,F.FEAT_ID, 
       R.FEAT_ID,F.FEAT_NAME   
FROM PROPERTY_TYPE T, PROPERTY P, LISTINGS L, PROPERTY_FEATURE R,FEATURE F 
WHERE P.P_TYPE_ID = T.P_TYPE_ID
     AND P.PTY_ID = L.PTY_ID(+)
     AND R.FEAT_ID= F.FEAT_ID(+)
     AND R.PTY_ID= P.PTY_ID
     AND REGEXP_LIKE (P.PTY_SUBURB,'Nunawading');

这是我的查询的原始结构,但它给了我重复的结果(虽然它们实际上不是因为它们是具有2个不同功能的相同条目)。从查询中我想要的是**给出了2个查询条件的功能,我只得到这个属性的1个条目,其中包含这2个特征**

以下是第二个查询的数据:

HERE

1 个答案:

答案 0 :(得分:0)

CREATE OR REPLACE FUNCTION reorder_delete() RETURNS trigger AS $$ DECLARE rw RECORD; BEGIN FOR rw IN SELECT * FROM list_items WHERE list = OLD.list AND pos > OLD.pos LOOP UPDATE list_items SET pos = rw.pos - 1 WHERE id = rw.id; END LOOP; RETURN NULL; END; $$ LANGUAGE plpgsql; CREATE TRIGGER do_reorder_delete AFTER DELETE ON list_items FOR EACH ROW EXECUTE PROCEDURE reorder_delete(); CREATE OR REPLACE FUNCTION reorder_update() RETURNS trigger AS $$ DECLARE rw RECORD; BEGIN FOR rw IN SELECT * FROM list_items WHERE list = NEW.list AND pos >= NEW.pos ORDER BY pos DESC LOOP UPDATE list_items SET pos = rw.pos + 1 WHERE id = rw.id; END LOOP; RETURN NULL; END; $$ LANGUAGE plpgsql; CREATE TRIGGER do_reorder_update BEFORE UPDATE ON list_items FOR EACH ROW EXECUTE PROCEDURE reorder_update(); 之后你有一个where条件......这会把它变成left join。将条件放入连接本身(inner join ...)。此外,2x可能的值需要ON

OR