簡體   English   中英

如何將子查詢與外部查詢相關聯以進行更新

[英]How to relate subquery to outer query for update

您好,我有一個看起來像這樣的數據庫。

uniqueid    description       name         phonenumber
66370         SALES       John_Doe_Cell      555-5555
87296         SALES       John_Doe_Home      555-4444
66786       ACCOUNTING    Jane_Doe_Cell      555-3333
67897       ACCOUNTING    Jane_Doe_Home      555-2222

我想運行一個查詢,將拉動phonenumber用於%_Cell和電話號碼轉到%_Home 因此,例如在上表中,我需要將John_Doe_Cell電話號碼放入John_Doe_Home電話號碼,對於Jane_Doe_Cell和Jane_Doe_Home也是如此。

到目前為止,我的隊列如下,但是我覺得它行不通。 我需要能夠將在查找過程中找到的名稱傳遞給%_Home以便它使用相應的電話號碼更新正確的名稱。

UPDATE `some_table` SET phonenumber=(SELECT phonenumber WHERE `name` LIKE '%_Cell')
WHERE queue_name LIKE '%_Home'

你的模式是奇數,至少可以這樣說,並可以站進行歸一化,而是要回答你的問題問的 ,你的問題是雙重的。

  1. 子選擇返回多個更新結果,並且

  2. 子選擇結果與UPDATE集無關。

根據您的數據,讓我們嘗試子選擇:

> SELECT phonenumber WHERE `name` LIKE '%_Cell';
+-------------+
| phonenumber |
+-------------+
| 555-5555    |
| 555-3333    |
+-------------+

要進行更新,您都需要讓子選擇返回1行,並且您要將其與外部查詢的行集相關聯。 例如,這將為您提供子選擇一行,但會為您提供錯誤的數據:

> UPDATE `some_table` AS upd SET phonenumber = (
    SELECT phonenumber
    FROM `some_table` AS inn
    WHERE
        `name` LIKE '%_Cell'
    LIMIT 1
  )
  WHERE queue_name LIKE '%_Home';

內部查詢將為每個外部行選擇哪一行? (提示:嘗試一下,看一下,也許是在事務中,以便您可以回滾結果。)要連接內部查詢和外部查詢,我猜這可能是您想要的:

> UPDATE `some_table` AS upd SET phonenumber = (
    SELECT phonenumber
    FROM `some_table` AS inn
    WHERE
        `name` LIKE '%_Cell'
    AND inn.description = upd.description
  )
  WHERE queue_name LIKE '%_Home';

請注意,給定問題提供的數據的inn.description = upd.description是唯一唯一連接所需行的數據。

在一般情況下(有明確的例外),在文本列和其他非索引字段上進行連接表示架構設計不良。 如果這是一個嚴肅的項目,我強烈建議您考慮將架構規范化為至少第三種規范形式。 (我將把谷歌搜索作為練習留給讀者。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM