2

SQL Server 2008 の使用

目的: table1 から一連の列を選択して table2 に挿入する

問題:テーブル 2 には、テーブル 1 とテーブル 3 の間の結合から派生できる、挿入する必要がある追加の列が 1 つあります。

現在のコード

SELECT
    table1.name,
    table1.email,
    table1.phone,
    CASE WHEN table1.status = 'active' THEN 1 ELSE 0 END AS Active,
    CASE WHEN table1.group_id = 3 THEN 5 ELSE table1.group_id END AS RoleId,
    (SELECT
        table3.UserID AS ParentID
     FROM
         table3
     INNER JOIN
         table1 ON
         table3.ID = table1.table3_ID)
FROM
    table1
WHERE
    table1.group_id = 3 AND
    table1.status = 'active'

現在、このコードは機能せず、「サブクエリが複数の値を返しました」というエラーを返します。これがネストされた選択を使用する正しい方法ではない可能性があることは承知していますが、これを行う正しい方法は何ですか?

必要に応じて、追加のデータを提供できます。前もって感謝します。

4

3 に答える 3

1

あなたが本当に(本当に本当に)あなたのコードsubqueryの代わりに使いたいのなら、それjoinはかなりうまくいきます。サブクエリを次のjoinように変更する必要があります。

SELECT
    table1.name,
    table1.email,
    table1.phone,
    CASE WHEN table1.status = 'active' THEN 1 ELSE 0 END AS Active,
    CASE WHEN table1.group_id = 3 THEN 5 ELSE table1.group_id END AS RoleId,
    (SELECT
        table3.UserID 
     FROM
         table3
     WHERE
         table3.ID = table1.table3_ID) AS ParentID
FROM
    table1
WHERE
    table1.group_id = 3 AND
    table1.status = 'active'

これとは別に、エイリアスを のParentID外側に置きsubqueryます。


テーブルエイリアスを使用した以下のコードを検討してください。コードが読みやすくなるため、これを使用することをお勧めします。

SELECT
    t1.name,
    t1.email,
    t1.phone,
    CASE WHEN t1.status = 'active' THEN 1 ELSE 0 END AS Active,
    CASE WHEN t1.group_id = 3 THEN 5 ELSE t1.group_id END AS RoleId,
    (SELECT
        table3.UserID 
     FROM
         table3 t3
     WHERE
         t3.ID = t1.table3_ID) AS ParentID
FROM
    table1 t1
WHERE
    t1.group_id = 3 AND
    t1.status = 'active'
于 2013-09-12T18:28:14.783 に答える
1

問題は、相関サブクエリが必要なことです。つまりtable1、サブクエリから削除する必要があります。

SELECT table1.name, table1.email, table1.phone,
       (CASE WHEN table1.status = 'active' THEN 1 ELSE 0 END) AS Active,
       (CASE WHEN table1.group_id = 3 THEN 5 ELSE table1.group_id END) AS RoleId,
       (SELECT table3.UserID 
        FROM table3
        WHERE table3.ID = table1.table3_ID
       ) as ParentID
FROM table1
WHERE table1.group_id = 3 AND table1.status = 'active';

に複数の一致候補がある場合は、またはtable3のようなものが必要になります。select top 1 table3.UserIdselect max(table3.UserId)

于 2013-09-12T18:34:43.987 に答える
1

選択の 'select .. from table' 部分に TOP 1 を追加することで、複数の値のエラーを解決できる可能性があります。ただし、それらを内部結合する方が簡単な場合があります。

SELECT
table1.name,
table1.email,
table1.phone,
CASE WHEN table1.status = 'active' THEN 1 ELSE 0 END AS Active,
CASE WHEN table1.group_id = 3 THEN 5 ELSE table1.group_id END AS RoleId,
table3.UserID
FROM    table1
INNER JOIN table3 ON
     table3.ID = table1.table3_ID
WHERE
table1.group_id = 3 AND
table1.status = 'active'
于 2013-09-12T18:32:50.217 に答える