簡體   English   中英

SQL Server:使用內部聯接和where子句選擇不同的記錄

[英]SQL Server : select distinct records with inner join and where clause

朋友,我被困在一個存儲過程中。 我無法顯示不同的記錄。

我有一個名字USERSPhotos 兩者都是使用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.

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