3

私はここで絶対SQLNoobであることを認めます(内部結合を行うことはできますが、SQLに関する知識と同じくらい「複雑」です)が、何かを最もよく達成する方法についてのヘルプ/洞察/アイデアを期待しています。私は会社のテーブルとそれらの会社の個人のサブテーブルを持っています。会社は郵送先住所を持つことができますが、個人が通常の会社の住所を上書きするために別の郵送先住所を持っている可能性があります。私の環境にはSQLServer2008があります。私の考えは、SQLクエリを次のように2回ループさせることでした。

SELECT tblIndividuals.FirstName,
       tblIndividuals.LastName,
       tblIndividuals.CompanyName,
       tblIndividuals.MailingAddress1,
       tblIndividuals.MailingAddress2,
       tblIndividuals.MailingAddress3,
       tblIndividuals.MailingAddress4,
       tblIndividuals.City,
       tblIndividuals.[State],
       tblIndividuals.Zip
FROM tblIndividuals
INNER JOIN tblCompanies ON tblIndividuals.CompanyName = tblCompanies.CompanyName
WHERE tblIndividuals.ChristmasList=1
  AND tblIndividuals.MailingAddress1 IS NOT NULL
  SELECT tblIndividuals.FirstName,
         tblIndividuals.LastName,
         tblIndividuals.CompanyName,
         tblCompanies.MailingAddress1,
         tblCompanies.MailingAddress2,
         tblCompanies.MailingAddress3,
         tblCompanies.MailingAddress4,
         tblCompanies.City,
         tblCompanies.[State],
         tblCompanies.Zip
  FROM tblIndividuals
  INNER JOIN tblCompanies ON tblIndividuals.CompanyName = tblCompanies.CompanyName WHERE tblIndividuals.ChristmasList=1
  AND tblIndividuals.MailingAddress1 IS NULL
ORDER BY tblIndividuals.CompanyName

このように、コードは1回ループし、会社の住所を上書きする郵送先住所を持つクリスマスリストのすべての個人を取得してから、デフォルトの会社を使用するクリスマスリストのすべての個人を取得するという考えでした。アドレス、最後にすべての結果を会社名でソートします。SQLに精通している方は、これが期待どおりに機能せず、2つのクエリを実行するだけであることがわかっています。SQLに精通している人は、私の最終的な目標を達成するために、ここでより良い方法で洞察を提供してくれるでしょうか。どんな助けでも大歓迎です。よろしくお願いします。

編集:最初のクエリは実際には内部結合を必要としないことを知っています。2番目のクエリからコピー/貼り付けしただけで、変更しませんでした。>。<

4

3 に答える 3

2
select tblIndividuals.FirstName, tblIndividuals.LastName, tblIndividuals.CompanyName, 
COALESCE(tblIndividuals.MailingAddress1, tblCompanies.MailingAddress1) AS MailingAddress1, 
CASE WHEN tblIndividuals.MailingAddress1 IS NULL THEN tblCompanies.MailingAddress2 ELSE tblIndividuals.MailingAddress2 END AS MailingAddress2, 
CASE WHEN tblIndividuals.MailingAddress1 IS NULL THEN tblCompanies.MailingAddress3 ELSE tblIndividuals.MailingAddress3 END AS MailingAddress3, 
CASE WHEN tblIndividuals.MailingAddress1 IS NULL THEN tblCompanies.MailingAddress4 ELSE tblIndividuals.MailingAddress4 END AS MailingAddress4, 
CASE WHEN tblIndividuals.MailingAddress1 IS NULL THEN tblCompanies.City ELSE tblIndividuals.City END AS City, 
CASE WHEN tblIndividuals.MailingAddress1 IS NULL THEN tblCompanies.[State] ELSE tblIndividuals.[State] END AS [State], 
CASE WHEN tblIndividuals.MailingAddress1 IS NULL THEN tblCompanies.Zip ELSE tblIndividuals.Zip END AS Zip
from tblIndividuals INNER JOIN tblCompanies
On tblIndividuals.CompanyName = tblCompanies.CompanyName
where tblIndividuals.ChristmasList=1
order by tblIndividuals.CompanyName

将来のためのいくつかのポイント。COALESCEは、「このリストの最初のnullではない」という意味です。CASEステートメントの使用法を理解するのは難しいことではありません。

最後に、CompanyNameを主キーとして使用することは、CompanyNameが変更される可能性があるため、お勧めできません。データベース設計の優れた入門書は次のとおりです。http://database-programmer.blogspot.com/2008/01/database-skills-third-normal-form-and.html

于 2012-05-11T17:46:44.787 に答える
2

CASEステートメントを使用します。すべてのデータが最初にあるので、2つのクエリは必要ありません...

Select tblIndividuals.FirstName, tblIndividuals.LastName, tblIndividuals.CompanyName,
    Case 
        When tblIndividuals.MailingAddress1 IS NULL then tblCompanies.MailingAddress1 
        Else tblIndividuals.MailingAddress1 END as MailingAddress1,
    Case 
        When tblIndividuals.MailingAddress1 IS NULL then tblCompanies.MailingAddress2 
        Else tblIndividuals.MailingAddress2 END as MailingAddress2,
    ....
from tblIndividuals INNER JOIN tblCompanies
On tblIndividuals.CompanyName = tblCompanies.CompanyName
where tblIndividuals.ChristmasList=1; 
于 2012-05-11T17:35:49.547 に答える
0

必要なのは

select tblIndividuals.FirstName, 
..
ISNULL(tblIndividuals.MailingAddress1, tblCompanies.MailingAddress1), 
ISNULL(tblIndividuals.MailingAddress2, tblCompanies.MailingAddress2), 
...
from tblIndividuals INNER JOIN tblCompanies
On tblIndividuals.CompanyName = tblCompanies.CompanyName
where tblIndividuals.ChristmasList=1

ISNULLは最初の入力を評価し、nullの場合は、2番目の入力を表示することに注意してください。ここにMSDNCOALESCEも見ることができます

于 2012-05-11T17:42:34.143 に答える