1

SQL リクエストの 1 つで本当にブロッキングの問題があります。私の問題は次のとおりです。いくつかのユーザーとその名前、住所、電話番号を含む最初のテーブル(一時テーブル)があります...いくつかのコマンドに関する情報を含む2番目のテーブル(「実際の」テーブル)があります. コマンドはユーザーに関連していますが、少し複雑です。より明確にするために、ここに私のテーブルの定義のサンプルがあります:

USER
ID          char(8)
LastName    nvarchar(30)
FirstName   nvarchar(30)
PostCode    nvarchar(10)
PhoneNumber nvarchar(20)
HomeAdress  nvarchar(20)

COMMAND
ID            char(6)
CMD_FirstName nvarchar(20)
CMD_LastName  nvarchar(20)
CMD_PostCode  nvarchar(10)
ID_User       char(8)

これら 2 つのテーブルは論理的に関連していますが、実際にはそうではありません... COMMAND テーブルでは、通常、フィールド "ID_User" が欠落しています。私の SQL リクエストの目的は、ID_User フィールドに入力することで、すべてのコマンドと対応するユーザーを関連付けることです。ID_User が null または空のコマンドごとに、姓、名、郵便番号のフィールドを照合してユーザーを取得したいと考えています。この一致が厳密である場合 (USER テーブルにダブロンがないことは重要です)、ID_User フィールドに入力できます。

この大きくて複雑なリクエストを手伝ってくれませんか? よろしくお願いします!

PS : Microsoft SQL Server 2008 R2 を使用しています

4

2 に答える 2

1

[USER] も [COMMAND] にも、マップに使用するフィールドの重複レコードが含まれていないことを確認する必要があります。これには相関クエリが含まれており、大きなテーブルではあまり効率的ではない場合があります。

update [command]
set ID_User = u.id
from [USER] u
join COMMAND c
    on u.LastName=c.CMD_LastName
    and u.FirstName = c.CMD_FirstName
    and u.PostCode = c.CMD_PostCode
where 1=1
    and not exists (
        select 
            LastName, FirstName, PostCode
        from [user]
        where 1=1
            and LastName=u.LastName
            and FirstName=u.FirstName
            and PostCode=u.PostCode
        group by 
            LastName, FirstName, PostCode
        having count(*)>1 
    )
    and not exists (
        select 
            CMD_LastName, CMD_FirstName, CMD_PostCode
        from COMMAND
        where 1=1
            and CMD_FirstName=c.CMD_FirstName
            and CMD_LastName=c.CMD_LastName
            and CMD_PostCode=c.CMD_PostCode
        group by 
            CMD_LastName, CMD_FirstName, CMD_PostCode
        having count(*)>1 
    )
于 2013-04-23T10:24:41.127 に答える