-1

テーブル'Images'があります。存在する場合はメイン画像を取得し、存在しない場合はテーブルの最初の行を取得します。私はこれを使用します:

SELECT Students.Id, Images.ImagePath
FROM Students INNER JOIN    
     Images 
     ON  Students.Id = Images.StudentId 
     AND (   (Images.IsMain = 1) 
          OR (Images.ImagePath = (
              SELECT TOP(1) ImagePath 
              FROM  Images 
              WHERE StudentId = Students.IdId)))
WHERE Students.Id = @StudentId

画像に「IsMain」がない場合は1行しか取得できませんが、「IsMain」がある場合は2回取得します。

http://sqlfiddle.com/#!3/3ade7/1

4

4 に答える 4

2

SELECT  a.*,
        CASE 
            WHEN b.StudentID IS NULL
            THEN c.ImagePath
            ELSE b.ImagePath
        END AS ImagePath
FROM    Students a
        LEFT JOIN
        (
            SELECT  StudentID, ImagePath
            FROM    Images
            WHERE   IsMain = 1
        ) b ON a.ID = b.StudentID
        LEFT JOIN
        (
            SELECT StudentID, ImagePath,
                    ROW_NUMBER() OVER (PARTITION BY  StudentID 
                                    ORDER BY ImagePath ASC) rn
            FROM    Images
        ) c ON c.rn = 1 AND
                a.ID = c.StudentID

アップデート

はるかに良いもの、

SELECT  a.*,
        c.ImagePath
FROM    Students a
        LEFT JOIN
        (
            SELECT StudentID, ImagePath,
                    ROW_NUMBER() OVER (PARTITION BY  StudentID 
                                    ORDER BY IsMain DESC) rn
            FROM    Images
        ) c ON  c.rn = 1 AND
                a.ID = c.StudentID
-- WHERE    a.ID = 1   -- remove this if you want for specific Student

生徒がテーブルに少なくとも1つのレコードを持っている必要がImagesある場合は、に変更LEFT JOININNER JOINます。

于 2013-01-21T12:07:08.450 に答える
1

問題は、IsMain画像最初の画像を選択していたことです。

次のコードは、最初の行を選択します。存在する場合はIsMain行になり、存在しない場合は一番上の行になります。

SELECT Students.Id, Images.ImagePath
FROM Students INNER JOIN    
    Images 
    ON  Students.Id = Images.StudentId 
    AND Images.ImagePath = (
        SELECT TOP(1) ImagePath 
        FROM Images 
        WHERE StudentId = Students.Id
        ORDER BY IsMain DESC) -- This line forces the IsMain image to be the top image returned.
WHERE Students.Id = 1
于 2013-01-21T12:06:48.250 に答える
0

なぜこれらすべてのクエリが非常に複雑なのですか、何かが足りないのですか?最初の行を取得するのと同じくらい簡単です

SELECT top (1) Students.Id, Images.ImagePath
FROM Students INNER JOIN    
     Images 
     ON  Students.Id = Images.StudentId 
WHERE Students.Id = 1
order by case when Images.IsMain = 1  then 1 else 0 end desc 
--order by Images.IsMain = 1  
于 2013-01-21T12:15:11.670 に答える
0

どうですか、

SELECT 
            S.Id, 
            COALESCE(MI.ImagePath, OI.ImagePath) ImagePath
FROM 
            Students S
    LEFT JOIN   
            Images MI 
                ON  S.Id = MI.StudentId AND MI.IsMain = 1
    INNER JOIN
            Images OI
            ( 
              SELECT TOP 1 ImagePath 
              FROM  Images 
              WHERE StudentId = Students.IdId
            )
    WHERE
        Students.Id = @StudentId

他のどの画像が選択されるかがわかるように、サブクエリで順序を指定する必要があります。

于 2013-01-21T12:12:35.583 に答える