这个问题可能听起来含糊不清,但请耐心等待。
我有几张表,都与某些属性的特征有关,它们是:
属性:包括属性的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个特征**
以下是第二个查询的数据:
答案 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