0

私は次のテーブルを持っています、スキーマは


表: メンバー

Id        // PK Int Auto Increment
MemberID
MembershipType        // Holds MemberShipMaster types 1/2/3 for Prem, Corp or Free
RegisteredCountry     // FK of CountryMaster table
RegisteredState       // FK of States Table
RegisteredCity        // FK of Districts table
PostalCountry         // FK of CountryMaster table
PostalState           // FK of States Table
PostalCity            // FK of Districts table

注意: 郵便番号と登録住所は異なる場合があります (その論理的...)


表 : CountryMaster

Id        // PK , int auto increment
Country   // Name of Country

表 : MemberShipMaster

Id               // PK int auto increment
Type             // Type Id int   , 1,2,3 respectively for Prem, Corp and Free
TypeName          // Membership Type Name e.g. Premium, Corporate, Free

トバレ : 都市

Id,         // PK int auto increment
Name       
StateId     // FK, PK of states table

表 : 状態

Id   // PK int auto increment
Name           
CountryId // FK , PK of COuntry

以下は私のクエリです

SELECT Id , MemberID, MembershipType, Districts.Name as RegisteredCity,
States.Name as RegisteredState,CountryMaster.Country as RegisteredCountry,
Districts.Name as PostalCity,States.Name as PostalState, CountryMaster.Country as PostalCountry 
FROM   dbo.JFPMembers RIGHT  JOIN MemberShipMaster ON MemberShipMaster.Id= dbo.JFPMembers.MembershipType  
LEFT  JOIN  Districts ON dbo.JFPMembers.PostalCity = Districts.Id OR  Districts.Id =JFPMembers.RegisteredCity
LEFT  JOIN  States ON States.Id = dbo.JFPMembers.RegisteredState OR States.Id = dbo.JFPMembers.PostalState
LEFT  JOIN CountryMaster ON CountryMaster.Id = dbo.JFPMembers.RegisteredCountry and CountryMaster.Id = dbo.JFPMembers.postalCountry
Where Id= @id

私の期待される出力:

列に保存されている ID に従って、下のフィールドに市、州、または国の適切な名前を入力します。しかし、その代わりに、目的の列に null 値を取得しています。結合を操作するために、データベースに 2 つの値が存在することを確認しました。

Districts.Name as RegisteredCity,States.Name as RegisteredState,CountryMaster.Country as RegisteredCountry,Districts.Name as PostalCity,States.Name as PostalState,,CountryMaster.Country as PostalCountry

4

3 に答える 3

1

郵便は、個別のエイリアスを介して、それぞれの国、州、都市のテーブルに独自に結合する必要があります...登録済みと同じ...

SELECT 
      M.Id, 
      M.MemberID, 
      M.MembershipType, 
      MM.TypeName as MembershipTypeName,
      RegCountryAlias.Country as RegisteredCountry,
      RegStatesAlias.Name as RegisteredState,
      RegCitiesAlias.Name as RegisteredCity,
      PostalCountryAlias.Country as PostalCountry,
      PostalStatesAlias.Name as PostalState,
      PostalCitiesAlias.Name as PostalCity
   FROM   
      JFPMembers M
         JOIN MemberShipMaster MM
            ON M.MembershipType = MemberShipMaster.Id

         JOIN CountryMaster as RegCountryAlias
            ON M.RegisteredCountry = RegCountryAlias.ID
         JOIN States as RegStatesAlias
            ON M.RegisteredState = RegStatesAlias.ID
         JOIN Cities as RegCitiesAlias
            ON M.RegisteredCity = RegCitiesAlias.ID

         JOIN CountryMaster as PostalCountryAlias
            ON M.PostalCountry = PostalCountryAlias.ID
         JOIN States as PostalStatesAlias
            ON M.PostalState = PostalStatesAlias.ID
         JOIN Cities as PostalCitiesAlias
            ON M.PostalCity = PostalCitiesAlias.ID
   WHERE
      M.ID = @id

Kenneth が指摘したように、対応する結合テーブルで特定の一致が見つからない列がある場合、NULL の可能性があるため、レコードは返されません。したがって、おそらく JOIN を LEFT JOIN に変更します。さらに、「Districts」テーブルについて言及しましたが、提供しませんでしたが、DID は、結合の基礎として使用した「Cities」テーブルを提供しました。

于 2013-06-27T18:48:19.287 に答える
0

LEFT JOIN CountryMaster ON CountryMaster.Id = dbo.JFPMembers.RegisteredCountry および CountryMaster.Id = dbo.JFPMembers.postalCountry

またはということですandor

于 2012-09-07T10:51:58.970 に答える