SQLステートメントのなじみのない文字
-
03-07-2019 - |
質問
これは一種のSQL初心者の質問ですが、ここに行きます。
ユーザー定義関数の例に基づいて作成したSQLクエリ(SQL Server 2005)があります:
SELECT
CASEID,
GetNoteText(CASEID)
FROM
(
SELECT
CASEID
FROM
ATTACHMENTS
GROUP BY
CASEID
) i
GO
U FROM句の後。クエリはiで正常に機能しますが、それなしでは失敗します。 「i」の意味は何ですか?
編集:ジョエルが以下で述べたように、それはキーワードではありません
解決
FROM句でサブクエリを使用する場合、クエリに名前を付ける必要があります。名前は実際には重要ではないため、「i」や「a」などの単純なものがよく選択されます。しかし、好きな名前をそこに置くことができます-'i'自体には意味がなく、キーワードではありません。
非常に複雑なクエリがある場合、サブクエリを他のクエリまたはテーブルと結合する必要がある場合があります。その場合、名前はより重要になり、より意味のあるものを選択する必要があります。
他のヒント
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
" i" selectステートメントに有効なテーブル名を付けています。 「AS i」と書くこともできます(私は思う-私はMSSQLServerの男ではありません)。
他の人が述べたように、それはサブクエリのテーブル名エイリアスです。
サブクエリの外部では、i.CASEIDを使用してサブクエリの結果を参照できます。
この例ではあまり有用ではありませんが、複数のサブクエリがある場合、これは非常に重要な曖昧性解消ツールです。
ただし、より適切な変数名を選択します。 「temp」でもより良いです。
iはサブクエリに名前を付けるので、多数のサブクエリを含む複雑なクエリがあり、フィールドにアクセスする必要がある場合は、明確な方法でアクセスできます。
より長いクエリを書き始めるときに混乱を避けるために、サブクエリにわかりやすい名前を付けることをお勧めします。 idは正しいもの、またはどのテーブル/クエリc.nameが取得されているかです。
学んだ教訓は、コードを継承する人を考えることです。他の人が言ったように、コードが次のように書かれていた場合:
SELECT DT1.CASEID, GetNoteText(DT1.CASEID)
FROM (
SELECT CASEID
FROM ATTACHMENTS
GROUP BY CASEID
) AS DT1 (CASEID);
その後、読者がそれを理解し、「派生テーブル」を暗示する「DT1」に気付く可能性が高くなります。
"派生テーブル" FROM句でサブクエリを使用するための技術用語です。
SQL Server Books Onlineの構文は、この場合table_aliasがオプションではないことを示しています。 " table_alias"は角括弧で囲まれておらず、Transact-SQL構文規則によると、角括弧内のものはオプションです。キーワード" AS"ただし、括弧で囲まれているため、オプションです...
    derived_table [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