0

悪いタイトルでごめんなさい-私はより良いものを考えることができません。

基本的に、SQL Server 2008は、失敗すると予想されるサブクエリを処理しています。

簡単な例を次に示します。

CREATE TABLE UserDemographics
(
    UserID      INT,
    UserName    NVARCHAR(500)
)

CREATE TABLE UserAddresses
(
    UserAddressID   INT,
    Address     NVARCHAR(500)
)


INSERT INTO UserDemographics(UserID, UserName) VALUES(1, 'Joe'), (2, 'Sam'), (3, 'Ed')

INSERT INTO UserAddresses(UserAddressID, Address) VALUES(1, '1st Street'), (2, 'Old Address 1'), (3, 'Old Address 2')

DELETE FROM UserDemographics
WHERE UserID IN
(
    SELECT UserID FROM UserAddresses
)

これが興味深い理由は次のとおりです。。UserAddressesという列がありませんUserID。相関サブクエリは、クエリしているテーブルに存在しない列を選択しています。

明らかに、それは相関サブクエリと関係があります-テーブルUserIDの列でUserDemographicsあり、何らかの理由でデータベースがその参照を作成しています。

おそらく、UserDemographicsテーブルはサブクエリのfrom-listに含まれています。

誰かがこれを説明できますか?

4

2 に答える 2

6

はい。相関サブクエリはUserDemographics.Useridを取得しています。これは、スコープ内の唯一のUserIdであるためです。

人口統計テーブルにAddressIdがあり、次のことを行ったとします。

DELETE FROM UserDemographics
WHERE AddressID IN ( SELECT AddressId FROM UserAddresses )

この場合、サブクエリのAddressIdはUserAddressesから取得されます。

この話の教訓は次の とおりです。サブクエリの列を参照するときは、常にテーブル名またはエイリアスを使用します。 以下は、予想されるエラーを取得します。

DELETE FROM UserDemographics
WHERE UserID IN ( SELECT ua.UserId FROM UserAddresses ua)
于 2012-05-15T00:42:48.310 に答える
0

テーブルUserAddressesのUserAddressIDは、実際にはtableUserDemographicsのUserIDへの外部キーです。

あなたが提示した価値のために

したがって、UserAddressIDを使用する必要があります

DELETE FROM UserDemographics
WHERE UserID IN
(
    SELECT UserAddressID FROM UserAddresses
)

しかし、私はこのスクリプトがUserAddressesテーブルにアドレスを持つすべてのユーザーを削除することを意味します

この場合、where句を追加する必要があります

DELETE FROM UserDemographics
WHERE UserID IN
(
    SELECT UserAddressID FROM UserAddresses where ???
)

UserAddressesテーブルに参照があるユーザーを削除するつもりがない限り

于 2012-05-15T08:24:37.147 に答える