SQL Selectサブクエリ
-
07-07-2019 - |
質問
私はSQLを少し使い始めましたが、次の問題に遭遇しました。
会社の詳細が記載されたテーブルがあり、enqIDによって連絡先テーブルに結合されています。
連絡先テーブルには、エントリがある場合とない場合の4種類の連絡先があります。これらはctcTypID(1-4)で区別されます
会社のすべてのレコードと、4つの異なる種類の連絡先それぞれの連絡先名をすべて1行で含むクエリを作成したい。
さまざまな連絡先ごとにサブクエリを使用してこれを行うことができると考えましたが、親のselect句を参照するサブクエリのselect句を記述する方法がわからないため、動作するようには見えません意味がわかります!)
これも可能ですか?私が言ったように、私はSQLにかなり慣れていないので、あざけりすぎないようにしてください!
ありがとう、
スティーブ
解決
次のようなもの(SQL Server 2005以降を使用していると仮定します-残念ながら、元の投稿では言及していません):
SELECT
c.CompanyName,
c1.ctcTypID, c1.ContactName,
c2.ctcTypID, c2.ContactName,
c3.ctcTypID, c3.ContactName,
c4.ctcTypID, c4.ContactName
FROM
CompanyTable c
LEFT OUTER JOIN
ContactTable c1 ON c.enqID = c1.enqID AND c1.ctcTypID = 1
LEFT OUTER JOIN
ContactTable c2 ON c.enqID = c2.enqID AND c2.ctcTypID = 2
LEFT OUTER JOIN
ContactTable c3 ON c.enqID = c3.enqID AND c3.ctcTypID = 3
LEFT OUTER JOIN
ContactTable c4 ON c.enqID = c4.enqID AND c4.ctcTypID = 4
一致しない可能性があるため、LEFT OUTER JOINを使用する必要があります。これを行うと、パフォーマンスの点でクエリが非常に高速になりませんが、うまくいくはずです。
マーク
他のヒント
これも機能するはずです。連絡先テーブルに複数回参加することを避けます。
SELECT
CompanyTable.CompanyName,
MAX(CASE WHEN ContactTable.ctcTypID = 1 THEN ContactTable.ContactName END) AS ContactName1,
MAX(CASE WHEN ContactTable.ctcTypID = 2 THEN ContactTable.ContactName END) AS ContactName2,
MAX(CASE WHEN ContactTable.ctcTypID = 3 THEN ContactTable.ContactName END) AS ContactName3,
MAX(CASE WHEN ContactTable.ctcTypID = 4 THEN ContactTable.ContactName END) AS ContactName4
FROM CompanyTable,
LEFT JOIN ContactTable
ON ContactTable.enqID = CompanyTable.enqID AND ContactTable.ctcTypID IN (1,2,3,4)
GROUP BY
CompanyTable.CompanyName
あなたは、それが設計されていないもののためにSQLを使用しようとしていると思います。 SQLはデータの操作と取得を可能にする言語であり、SQLを使用して取得したデータの出力をフォーマットしようとしているため、これを行うべきではないと思います。
データをSQLでフォーマット(f.i.の1行にすべての連絡先を配置)しようとしないでください。 私のアドバイスは、最もパフォーマンスの高いSQLクエリを使用してデータベースからデータを取得し、出力を別の言語(C#、Delphi、PHP、あなたが使用しているものは何でも)でフォーマットする(同じ行に連絡先を置く)だけですアプリケーション)。