[英]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
請注意:郵政和注冊地址可能不同(其邏輯......)
Id // PK , int auto increment
Country // Name of Country
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,在下面的字段中顯示城市,州或國家/地區的適當名稱。 但我沒有在所需的列中獲得空值 。 我已經確認數據庫中存在兩個用於處理聯接的值。
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
你是說and
或or
?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.