[英]SQL server: select and join table where relationship is varchar and unique identifier
[英]SQL Server : select distinct records with inner join and where clause
朋友,我被困在一個存儲過程中。 我無法顯示不同的記錄。
我有一個名字USERS
和Photos
。 兩者都是使用userID
內部userID
。
由於“ Photos
”表具有多個記錄,因此將重復搜索結果。 朋友,您能幫我解決這個問題嗎?
存儲過程:
ALTER PROCEDURE dbo.homesearch
@gender varchar(6),
@age int,
@age2 int,
@religion varchar(50),
@status varchar(11),
@Country varchar(50),
@City varchar(50)
AS
SELECT
users.userID, photos.filename, users.userName,
users.FirstName, users.LastName, users.nationality,
users.Country, users.City, users.age, users.status
FROM
users
INNER JOIN
photos ON users.userID = photos.userID
WHERE
(users.age >= @age) AND (users.age <= @age2)
AND (users.gender = @gender) AND (users.religion = @religion)
AND (users.status = @status) AND (users.Country = @Country)
AND (users.City = @City)
RETURN
您可以使用CROSS APPLY
執行類似的操作
SELECT u.userID
,u.userName
,P.filename
,u.FirstName
,u.LastName
,u.nationality
,u.Country
,u.City
,u.age
,u.status
FROM users u
CROSS APPLY
(
SELECT TOP 1 photos.filename
FROM photos
WHERE u.userID = userID
ORDER BY photos.SomeColumn --<-- Pick a column here
)p
WHERE (u.age >= @age) AND (u.age <= @age2)
AND (u.gender = @gender) AND (u.religion = @religion)
AND (u.status = @status) AND (u.Country = @Country)
AND (u.City = @City)
選擇一列,您要根據該列來決定要從“照片”表中為“用戶”表中的每個用戶選擇哪個TOP 1文件名。
或使用CTE
;With P_CTE
AS
(
SELECT TOP UserID, photos.filename,
rn = ROW_NUMBER() OVER (PARTITION BY UserID ORDER BY UserID)
FROM photos
)
SELECT users.userID, P_CTE.filename, users.userName,
users.FirstName, users.LastName, users.nationality,
users.Country, users.City, users.age, users.status
FROM users INNER JOIN P_CTE
ON users.userID = P_CTE.userID
WHERE (users.age >= @age) AND (users.age <= @age2)
AND (users.gender = @gender) AND (users.religion = @religion)
AND (users.status = @status) AND (users.Country = @Country)
AND (users.City = @City)
AND P_CTE.rn = 1
通過以下方式修改您的選擇查詢:
SELECT users.userID, photos.filename, users.userName,
users.FirstName, users.LastName, users.nationality,
users.Country, users.City, users.age, users.status
FROM users INNER JOIN photos
ON users.userID = photos.userID
WHERE (users.age >= @age) AND (users.age <= @age2)
AND (users.gender = @gender) AND (users.religion = @religion)
AND (users.status = @status) AND (users.Country = @Country)
AND (users.City = @City)
GROUP BY users.userID, photos.filename, users.userName,
users.FirstName, users.LastName, users.nationality,
users.Country, users.City, users.age, users.status
它將返回唯一的結果。
SELECT users.userID, photos.filename, users.userName,
users.FirstName, users.LastName, users.nationality,
users.Country, users.City, users.age, users.status
FROM users INNER JOIN (SELECT DISTINCT userID FROM photos) AS P
ON users.userID = P.userID
這里的想法是減少“照片”表中的條目,因為每個用戶都有很多照片。 在我的示例中,我使用max(filename)
來獲得名稱最長的max(filename)
,但是您可以在此處使用其他條件:
SELECT users.userID, P.filename, users.userName,
users.FirstName, users.LastName, users.nationality,
users.Country, users.City, users.age, users.status
FROM users INNER JOIN
(SELECT userID, max(filename) as filename
FROM photos
GROUP BY userID) AS P
ON users.userID = P.userID
WHERE (users.age >= @age) AND (users.age <= @age2)
AND (users.gender = @gender) AND (users.religion = @religion)
AND (users.status = @status) AND (users.Country = @Country)
AND (users.City = @City)
請清除阿里的幾點。
您的數據顯示類似..
userID userName ......... filename
1 ABC c:/phot1.png
1 ABC c:/phot2.png
1 ABC c:/phot2.png
如果我是正確的,那么它們是兩種顯示您的數據以使您的記錄與眾不同的方法。
第一
userID userName ......... filename
1 ABC c:/phot1.png,c:/phot2.png,c:/phot2.png
這可以通過使用for xml path('')
或COALESCE
第二
只顯示一張照片,例如:
userID userName ......... filename
1 ABC c:/photo1.png
這可以通過為照片應用一些條件來實現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.