聚結,NVL,IFNULL在大多數數據庫引擎將做一個有條件的聲明說,拿在這種情況下,字符串中的第一個非空值時,再選擇返回null它將設置ave_price =本身。
UPDATE user_stats as stats
SET ave_price = coalesce((
SELECT AVG(l.price)
FROM lengths as l, user_sessions as us
WHERE l.product_type = 'car'
AND l.session_id = us.session_id
AND stats.user_id = us.user_id
),ave_price)
這並不妨礙udpate的要求,但它對數據有類似的影響。
有關COALESCE查看更多資訊:PostgreSQL
要真正防止更新你會needto上的更新添加一個WHERE子句和重新執行子查詢,如:
UPDATE user_stats as stats
SET ave_price = (
SELECT AVG(l.price)
FROM lengths as l, user_sessions as us
WHERE l.product_type = 'car'
AND l.session_id = us.session_id
AND stats.user_id = us.user_id)
WHERE (SELECT AVG(l.price)
FROM lengths as l, user_sessions as us
WHERE l.product_type = 'car'
AND l.session_id = us.session_id
AND stats.user_id = us.user_id) is not null
邏輯上執行子查詢兩次會對性能產生兩次影響;而合併只需要執行一次。總是有多種方式來完成任務,並且根據要求,必須選擇哪種選項最適合他們。
重要爲這個問題允許數據修改命令(INSERT /更新/刪除):的PostgreSQL版本號? – 2011-12-17 13:30:33
請張貼您的表格定義(至少相關的列和PK/FK約束),並儘可能提供一個小腳本來用測試數據填充表格。 – tscho 2011-12-17 13:33:10
@ErwinBrandstetter:我很想知道你在找哪個功能。它是CTE,因此最小的PostgreSQL 8.4? – tscho 2011-12-17 13:42:32