3

これは一種のSQL初心者の質問だと思いますが、ここで説明します。

ユーザー定義関数の例に基づいてまとめたSQLクエリ(SQL Server 2005)があります。

SELECT 
    CASEID,
    GetNoteText(CASEID)
FROM 
( 
    SELECT 
        CASEID 
    FROM 
        ATTACHMENTS 
    GROUP BY 
        CASEID 
) i
GO 

UDFはうまく機能します(それが重要な場合は、関連するテーブルの複数の行からのデータを連結します)が、FROM句の後の「i」について混乱しています。クエリはiで正常に機能しますが、iがないと失敗します。「i」の意味は何ですか?

編集:ジョエルが以下に述べたように、それはキーワードではありません

4

7 に答える 7

16

FROM句でサブクエリを使用する場合は、クエリに名前を付ける必要があります。名前はあまり重要ではないため、「i」や「a」などの単純なものがよく選択されます。ただし、任意の名前を付けることができます。「i」だけでは意味がなく、キーワードではありません。

非常に複雑なクエリがある場合は、サブクエリを他のクエリまたはテーブルと結合する必要がある場合があります。その場合、名前がより重要になり、より意味のあるものを選択する必要があります。

于 2008-10-01T14:21:14.157 に答える
6

iは(サブクエリ)に名前を付けます。これは必須であり、さらに結合するためにも必要です。

次のように、結合されたテーブル間で競合する列名がある場合は、外部クエリの列の前にサブクエリ名を付ける必要があります。

SELECT 
    c.CASEID, c.CASE_NAME,
    a.COUNT AS ATTACHMENTSCOUNT, o.COUNT as OTHERCOUNT,
    dbo.GetNoteText(c.CASEID)
FROM CASES c
LEFT OUTER JOIN
( 
    SELECT 
        CASEID, COUNT(*) AS COUNT
    FROM 
        ATTACHMENTS 
    GROUP BY 
        CASEID 
) a
ON a.CASEID = c.CASEID
LEFT OUTER JOIN
(
    SELECT 
        CASEID, COUNT(*) AS COUNT
    FROM 
        OTHER
    GROUP BY 
        CASEID 
) o
ON o.CASEID = c.CASEID
于 2008-10-01T14:32:12.620 に答える
3

「i」は、selectステートメントに有効なテーブル名を付けています。「ASi」と書くこともできます(私はMSSQLServerの人ではないと思います)。

于 2008-10-01T14:22:27.430 に答える
1

他の人が述べたように、それはサブクエリのテーブル名エイリアスです。

サブクエリの外部では、i.CASEIDを使用してサブクエリの結果を参照できます。

この例ではあまり役に立ちませんが、複数のサブクエリがある場合は、非常に重要な曖昧性解消ツールです。

ただし、より適切な変数名を選択します。「臨時雇用者」でさえより良いです。

于 2008-10-01T14:31:09.237 に答える
1

i はサブクエリに名前を付けて、多数のサブクエリを含む複雑なクエリがあり、フィールドにアクセスする必要がある場合に、明確な方法でアクセスできるようにします。

サブクエリにわかりやすい名前を付けて、より長いクエリを書き始めたときに混乱を避けることをお勧めします。どの i.id がどの i.id であるかを忘れてしまったために、長い SQL ステートメントを上にスクロールしなければならないことほど悪いことはありません。正しいもの、または c.name が取得されているテーブル/クエリ。

于 2008-10-01T14:48:58.040 に答える
0

「派生テーブル」は、FROM句でサブクエリを使用するための専門用語です。

SQL Server Books Onlineの構文は、この場合、table_aliasがオプションではないことを示しています。「table_alias」は角かっこで囲まれていません。Transact-SQL構文規則に従って、角かっこで囲まれたものはオプションです。キーワード「AS」は角かっこで囲まれているため、オプションです。

   派生テーブル[AS]table_alias[(column_alias [、... n])]

FROM(Transact-SQL):http:
//msdn.microsoft.com/en-us/library/ms177634 (SQL.90).aspx

Transact-SQLの構文規則:http:
//msdn.microsoft.com/en-us/library/ms177563 (SQL.90).aspx

于 2008-10-02T02:03:20.163 に答える
0

学んだ教訓は、あなたのコードを継承する人のことを考えることです。他の人が言ったように、コードが次のように書かれていたら:

SELECT DT1.CASEID, GetNoteText(DT1.CASEID) 
FROM (
   SELECT CASEID 
   FROM ATTACHMENTS
   GROUP BY CASEID
) AS DT1 (CASEID);

次に、読者がそれを理解する可能性が高くなり、「派生テーブル」をほのめかしている「DT1」に気付く可能性さえあります。

于 2008-10-02T10:42:02.430 に答える