您可以使用a case expression檢查值的合計數爲每個ID:
select t2.id, case when count(l.id) > 1 then null else max(l.id) end as lid
from list l
inner join distance d on l.ueid=d.ueid
inner join transaction t2 on t2.id=d.id
group by t2.id
然後使用它作爲一個子查詢,與相關 - 例如 - 來自transaction
表的ID:
update transaction t
set t.lid= (
select case when count(l.id) > 1 then null else max(l.id) end as lid
from list l
inner join distance d on l.ueid=d.ueid
inner join transaction t2 on t2.id=d.id
where t2.id = t.id
group by t2.id
)
其中與where t2.id = t.id
子句進行關聯。但如果這是你做檢查,你可能真的不希望t2
可言:
update transaction t
set t.lid= (
select case when count(l.id) > 1 then null else max(l.id) end as lid
from list l
inner join distance d on l.ueid=d.ueid
where d.id = t.id
group by d.id
)
與where d.id = t.id
現在相關。
如果你可能會得到同樣的
蓋value, and in that case still want to use that single repeated value instead of null, then you can add a
distinct`以計數的多個實例:
update transaction t
set t.lid= (
select case when count(distinct l.id) > 1 then null else max(l.id) end as lid
from list l
inner join distance d on l.ueid=d.ueid
where d.id = t.id
group by d.id
)
未經檢驗的,因爲沒有樣本數據,從工作,並沒有預期的結果,但希望對齊與你的描述......
另外請注意,這將更新現有的transaction.lid
值爲null如果在子查詢沒有匹配值 - 不只是當有多個匹配。如果這不是你想要發生的,那麼你可以使用exists
子句添加一個過濾器來限制哪些行被更新。您也可以使用merge
,但update
可能在這裏更簡單和更清晰。
你正在更新的't'和子查詢之間似乎沒有任何相關性 - 是't2'所需要的,如果不是這樣的話,那麼這是一次性更新或者你真的應該用視圖?還有一些樣本數據和預期結果可能會有用。而'uid'是一個保留字,那麼這真的是一個帶引號的標識符嗎? –
@AlexPoole我更新了我的問題(請參閱編輯)。 uid是一個錯字。這是ueid。 – WowBow