3

私が本の2つのテーブルとそれらの対応する版の2つのテーブルを持っているとしましょう。

次のようなクエリがあります。

SELECT TOP 10 * FROM
(SELECT hbID, hbTitle, hbPublisherID, hbPublishDate, hbedID, hbedDate
 FROM hardback
 LEFT JOIN hardbackEdition on hbID = hbedID
 UNION 
 SELECT pbID, pbTitle, pbPublisher, pbPublishDate, pbedID, pbedDate
 FROM paperback
 Left JOIN paperbackEdition on pbID = pbedID
) books
WHERE hbPublisherID = 7
ORDER BY hbPublishDate DESC

最初の2冊のハードカバーおよび/またはペーパーバックの本の5つのエディションがある場合、このクエリは2冊の本のみを返します。TOP 10ただし、実際に返却された本のレコード数にのみ適用したい。実際の10冊の本を選択しても、関連するすべての版のレコードを取得する方法はありますか?

関連する場合は、一時テーブルを作成および削除するためのデータベース権限がありません。

読んでくれてありがとう!

アップデート

明確にするために:ペーパーバックの表には、ペーパーバック版の関連する表があります。ハードカバーの表には、ハードカバー版の関連する表があります。ハードカバーとペーパーバックのテーブルは、(願わくば!)それらが一緒に表示されるのを見るユーザーを除いて、互いに関連していません。

4

3 に答える 3

1

私があなたを正しく理解していれば、関連するすべてのエディションを含む10冊の本を

  • ステートメントを使用してWITH、最初の完全な結果セットを返す
  • を使用して10冊の異なる本を選択しますGROUP BY
  • JOINこのグループの結果は、与えられた10冊の本からのすべての情報を保持します。

SQLステートメント

;WITH books AS (
  SELECT  hbID, hbTitle, hbPublisherID, hbPublishDate, hbedID, hbedDate
  FROM    hardback
          LEFT JOIN hardbackEdition on hbID = hbedID
  WHERE   hbPublisherID = 7          
  UNION ALL
  SELECT  pbID, pbTitle, pbPublisher, pbPublishDate, pbedID, pbedDate
  FROM    paperback
          LEFT JOIN paperbackEdition on pbID = pbedID
  WHERE   hbPublisherID = 7
)
SELECT  *
FROM    books b
        INNER JOIN (
          SELECT TOP 10 hbID
          FROM   books
          GROUP BY
                hbID
        ) bt ON bt.hbID = b.hbID

または、where句を1回だけ記述したい場合

;WITH books AS (
  SELECT  hbID, hbTitle, hbPublisherID, hbPublishDate, hbedID, hbedDate
  FROM    hardback
          LEFT JOIN hardbackEdition on hbID = hbedID
  UNION ALL
  SELECT  pbID, pbTitle, pbPublisher, pbPublishDate, pbedID, pbedDate
  FROM    paperback
          LEFT JOIN paperbackEdition on pbID = pbedID
)
, q AS (
  SELECT  *
  FROM    books
  WHERE   hbPublisherID = 7          
)
SELECT  *
FROM    q b
        INNER JOIN (
          SELECT TOP 10 hbID
          FROM   q
          GROUP BY
                hbID
        ) bt ON bt.hbID = b.hbID
于 2012-04-16T11:40:50.977 に答える
0

これは、出版社7からのハードカバーで最近公開された10のタイトルを取得する必要があります。

select  *
from    (
        select  top 10 title
        from    hardback
        where   hbPublisherID = 7
        group by
                title
        order by
                hbPublishDate desc
        ) top_titles
left join
      hardback
on    hardback.hbTitle = top_titles.title
left join
      paperback
on    paperback.pbTitle = top_titles.title
于 2012-04-16T08:25:19.223 に答える
0

それほど簡単ではありません。トップ10は、結合なしでハードカバーとペーパーバックのテーブルにのみ適用する必要があります。次に、結果をデータに結合します。

次のクエリは、hbIDとpbIDが常に一意である場合にのみ機能します。そうでなければ、それはより複雑になります。それらを区別するために、それらを分離するか、クエリに別の列を追加する必要があります。

SELECT *
FROM
  (SELECT hbID as id, hbTitle, hbPublisherID, hbPublishDate, hbedID, hbedDate
   FROM hardback
   LEFT JOIN hardbackEdition on hbID = hbedID
   UNION 
   SELECT pbID as id, pbTitle, pbPublisher, pbPublishDate, pbedID, pbedDate
   FROM paperback
   Left JOIN paperbackEdition on pbID = pbedID
  ) books
INNER JOIN 
  (SELECT TOP 10 * 
  FROM
    (SELECT hbID as id, hbPublisherID as publishedId, hbPublishDate as publishDate
     FROM hardback
     UNION 
     SELECT pbID as id, pbPublisherID as publishedId, pbPublishDate as publishDate
     FROM paperback
    ) 
  WHERE publisherID = 7
  ORDER BY publishDate DESC
  ) topTen 
  on books.id = TopTen.id
于 2012-04-16T08:24:26.253 に答える