2

地理情報を含むSQLデータベースがあります。このデータベースには3つのテーブルがあります。

PostalCode
----------
Code  (char(10))
StateID (uniqueidentifier)

State
-----
ID (uniqueidentifier)
Name (nvarchar(max))
CountryID (uniqueidentifier)

Country
-------
ID (uniqueidentifier)
Name

関係は次のとおりです。国には州があります。州には郵便番号があります。特定の郵便番号が属する国のすべての州を見つけることができるクエリを作成しようとしています。現在、私は次のことを試みています:

SELECT 
  s.*
FROM 
  [PostalCode] p, 
  [State] s,
  [Country] c
WHERE
  p.[Zip]='90028' AND 
  p.[StateID]=s.[ID] AND 
  s.[CountryID]=c.[ID]

残念ながら、この結果は1レコード(カリフォルニアに関連付けられた州のレコード)を返します。ただし、実際には、50レコード(米国の州ごとに1つ)を返す必要があります。これを行うためにこのクエリを変更するにはどうすればよいですか?

ありがとうございました

4

1 に答える 1

3

を使用している場合は、構文を:INNER JOINに変更する必要があります。LEFT JOIN

SELECT  s.*
FROM [State] s
LEFT JOIN [PostalCode] p
  ON p.[StateID]=s.[ID]
  AND p.[Zip]='90028'
LEFT JOIN [Country] c
  ON s.[CountryID]=c.[ID]

ANSI JOINテーブルをコンマとWHERE句で結合する代わりに構文を使用するように変更したことに気付くでしょう。

Aは、他のテーブルに一致する行がない場合でもLEFT JOIN、テーブルからすべての行を返します。state

郵便番号が特定のコードと等しい国のすべての州を返す場合は、次を使用できます。

select s.*
from state s
inner join
(
  SELECT s.countryid
  FROM [State] s
  INNER JOIN [PostalCode] p
    ON p.[StateID]=s.[ID]
  INNER JOIN [Country] c
    ON s.[CountryID]=c.[ID]
  WHERE p.[Zip]='90028'
) c
  on s.countryid = c.countryid;

または、次を使用できます。

select s1.*
from state s1
where exists (select s2.countryid
              from state s2
              inner join country c
                on s2.countryid = c.id
              inner join postalcode p
                on s2.id = p.stateid
              where p.zip = 90028
               and s1.countryid = s2.countryid)
于 2013-03-15T17:22:42.093 に答える