簡體   English   中英

SQL:在Sql Server中需要幫助加入

[英]SQL : Needs help in joins in Sql Server

我有以下表格,模式是


表:成員

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

Tbale:城市

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,在下面的字段中顯示城市,州或國家/地區的適當名稱。 但我沒有在所需的列中獲得空值 我已經確認數據庫中存在兩個用於處理聯接的值。

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

你的問題是你正試圖加入兩種不同的條件。 而是兩次加入查找表。 像這樣:

SELECT Id , MemberID, MembershipType, RegDistricts.Name as RegisteredCity,
    RegStates.Name as RegisteredState, RegCountryMaster.Country as RegisteredCountry,
    PostalDistricts.Name as PostalCity, PostalStates.Name as PostalState, 
    PostalCountryMaster.Country as PostalCountry 
FROM dbo.JFPMembers 
LEFT JOIN MemberShipMaster 
    ON MemberShipMaster.Id = dbo.JFPMembers.MembershipType  
LEFT JOIN Districts RegDistricts
    ON RegDistricts.Id = JFPMembers.RegisteredCity
LEFT JOIN Districts  PostalDistricts
    ON dbo.JFPMembers.PostalCity = PostalDistricts.Id 
LEFT JOIN States RegStates
    ON RegStates.Id = dbo.JFPMembers.RegisteredState 
LEFT JOIN States PostalStates
    ON PostalStates.Id = dbo.JFPMembers.PostalState
LEFT JOIN CountryMaster RegCountryMaster
    ON RegCountryMaster.Id = dbo.JFPMembers.RegisteredCountry 
LEFT JOIN CountryMaster PostalCountryMaster
    ON PostalCountryMaster.Id = dbo.JFPMembers.postalCountry
Where Id= @id

郵政需要通過單獨的別名連接到相應的國家,州和城市表...與注冊相同...

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。 另外,你提到了一個“區”表,但沒有提供,但是DID提供了你所用的“城市”表作為連接的基礎。

LEFT JOIN CountryMaster ON CountryMaster.Id = dbo.JFPMembers.RegisteredCountry和CountryMaster.Id = dbo.JFPMembers.postalCountry

你是說andor

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM