1

動的なINNERJOINを作成する必要があります(とにかく作成する必要があると思います)。梨、りんご、オレンジ、バナナのテーブルが4つあります。これらの4つのテーブルですべて同じ列名を使用しました。

別の2つのテーブル「fruit」と「fruitcomments」

pears    apples    oranges   bananas
-------------------------------------
id
user
photo
comment
date

Fruitsテーブルのtypeidは、他のテーブルに関連しています1 =梨、2 =リンゴ、3 =オレンジ、4=バナナ。Itemidは、梨、リンゴ、オレンジ、バナナのいずれかのIDに相関します。

Fruit 
-----------------------------------------------------------------------------
fruitsid
typeid
itemid

フルーツテーブルからトップ10を選択し、対応するテーブルから一致する行を動的に取得するにはどうすればよいですか?

ワーキングコード

SELECT TOP (10) fruitId, id, user, photo, comment FROM 
(
    SELECT T1.fruitsId, T2.id, T2.user, T2.photo, T2.comment 
    FROM FRUITS T1 LEFT JOIN PEARS T2 ON (T1.itemId=T2.id)
    WHERE T1.typeId=1
UNION ALL
    SELECT T1.fruitsId, T2.id, T2.user, T2.photo, T2.comment 
    FROM FRUITS T1 LEFT JOIN APPLES T2 ON (T1.itemId=T2.id)
    WHERE T1.typeId=2
UNION ALL
    SELECT T1.fruitsId, T2.id, T2.user, T2.photo, T2.comment 
    FROM FRUITS T1 LEFT JOIN ORANGES T2 ON (T1.itemId=T2.id)
    WHERE T1.typeId=3
UNION ALL 
    SELECT T1.fruitsId, T2.id, T2.user, T2.photo, T2.comment 
    FROM FRUITS T1 LEFT JOIN BANANAS T2 ON (T1.itemId=T2.id)
    WHERE T1.typeId=4
)a
ORDER BY fruitId DESC

古い非動作コード:

SELECT TOP (10) id, user, photo, comment FROM
(

SELECT f.typeid, f.itemid, a.id, a.user, a.photo, a.comment FROM Fruit f INNER JOIN a on f.item=a.id

--excuse the gibberish. I never used CASE before
case when f.typeid=1 then
(SELECT id, user, photo, comment FROM Pears WHERE id=f.itemid)a
case when f.typeid=2 then
(SELECT id, user, photo, comment FROM Apples WHERE id=f.itemid)a
case when f.typeid=3 then
(SELECT id, user, photo, comment FROM Oranges WHERE id=f.itemid)a
case when f.typeid=4 then
(SELECT id, user, photo, comment FROM Bananas WHERE id=f.itemid)a
)

そんな感じですが、正しく表現する方法がわかりません。フルーツシドDESCによる次の「フルーツ」テーブルの順序からトップ(3)を選択すると、以下の期待される結果が得られます。

fruits
-----------
fruitsid   typeid     itemid
22         1          19
23         3          73
24         2          46

pears
--------------
id     user     photo    comment    date
19     tom      1.jpg    hi         2012-06-01 12:00:00.000
22     bill     5.jpg    hello      2012-06-01 13:00:00.000

apples
--------------
id     user     photo    comment
46     sam      78.jpg   howdy
22     bill     5.jpg    hello

bananas
--------------
id     user     photo    comment
32     tom      1.jpg    hi
73     bill     5.jpg    hello

oranges
--------------
id     user     photo    comment
73     jane     55.jpg   wave
22     bill     5.jpg    hello

results
-------------
19     tom      1.jpg    hi 
73     bill     5.jpg    hello
46     sam      78.jpg   howdy

新しいコードでUNIONALLを使用した4行のIO統計

(4 row(s) affected)
Table 'pears'. Scan count 1, logical reads 1, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'fruit'. Scan count 3, logical reads 3, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'apples'. Scan count 1, logical reads 16, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'oranges'. Scan count 1, logical reads 115, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

少なくとも、素晴らしい物理的な読み取りは1つもありませんでした

4

1 に答える 1

0

それを行う1つの方法は、UNIONを使用してそれぞれを結合することです-

SELECT TOP (10) fruitId, id, user, photo, comment FROM 
(
    SELECT T1.fruitsId, T2.id, T2.user, T2.photo, T2.comment 
    FROM FRUITS T1 LEFT JOIN PEARS T2 ON (T1.itemId=T2.id)
    WHERE T1.typeId=1
UNION ALL
    SELECT T1.fruitsId, T2.id, T2.user, T2.photo, T2.comment 
    FROM FRUITS T1 LEFT JOIN APPLES T2 ON (T1.itemId=T2.id)
    WHERE T1.typeId=2
UNION ALL
    SELECT T1.fruitsId, T2.id, T2.user, T2.photo, T2.comment 
    FROM FRUITS T1 LEFT JOIN ORANGES T2 ON (T1.itemId=T2.id)
    WHERE T1.typeId=3
UNION ALL
    SELECT T1.fruitsId, T2.id, T2.user, T2.photo, T2.comment 
    FROM FRUITS T1 LEFT JOIN BANANAS T2 ON (T1.itemId=T2.id)
    WHERE T1.typeId=4
)
ORDER BY fruitId DESC

のみに存在し、存在しないレコードを含めたくない場合はFruits、代わりPEAR|APPLES|ORACNGES|BANANASに使用しますINNER JOIN

于 2012-06-21T04:52:52.110 に答える