2009-05-15 10 views
0

私はこのクエリを持っている:SQLサブクエリは2つ以上の値を返すことはできますか?

SELECT Items.Name, tblBooks.AuthorLastName, tblBooks.AuthorFirstName 
FROM Items WHERE Items.ProductCode IN (
SELECT TOP 10 Recommended.ProductCode 
FROM 
Recommended 
INNER JOIN Stock ON Recomended.ProductCode = Stock.ProductCode 
AND Stock.StatusCode = 1 
WHERE (Recommended.Type = 'TOPICAL') ORDER BY CHECKSUM(NEWID())); 

それは推奨テーブルは、私は次のRecommended.ProductCodeにそれを入れて、クエリがまだ動作することはできませんが、私はまた、必要なSKUフィールドを持っていることを除いて、私のデータの罰金です。
私はこのクエリにJOINSを使用していますが、これらの機能はありますが、このクエリは速く実行されます。推奨テーブルからProductCodeとSKUが必要です。
データベース:MS SQL Server 2000の

答えて

1

サブクエリは10のランダムな推奨事項を選択しているようです。これは、サブクエリからそれらを渡すことなく、あなたはすべての列にアクセスすることができます

SELECT TOP 10 
    Items.*, 
    Recommended.*, 
    Stock.* 
FROM Items 
INNER JOIN Recommended 
    ON Items.ProductCode = Recommended.ProductCode 
    AND Recommended.Type = 'TOPICAL' 
INNER JOIN Stock 
    ON Recomended.ProductCode = Stock.ProductCode 
    AND Stock.StatusCode = 1 
ORDER BY CHECKSUM(NEWID()) 

:私はあなたがサブクエリなしでそれを行うことができると思います。

0

あなたは参加者が推奨テーブルからフィールドを取得する必要があるので、あなたは唯一、副選択で一つの値を返すことができます - 私は推測それはあなたがすでに持っているものです。

 
SELECT Items.Name, tblBooks.AuthorLastName, tblBooks.AuthorFirstName, Recommended.SKU 
FROM Items 
INNER JOIN Recommended ON Recommended.ProductCode = Items.ProductCode 
WHERE Items.ProductCode IN (
SELECT TOP 10 Recommended.ProductCode 
FROM 
Recommended 
INNER JOIN Stock ON Recomended.ProductCode = Stock.ProductCode 
AND Stock.StatusCode = 1 
WHERE (Recommended.Type = 'TOPICAL') ORDER BY CHECKSUM(NEWID())); 

現実にはJoinはあまりにもアウターです。これは、ProductCodeで索引付けされたItems表とRecommended表の両方を持っている限り、実際にはパフォーマンス上の問題はありません。

0

私はあなたがWHERE句のうち、サブクエリを移動する必要があると思う:

SELECT Items.Name, tblBooks.AuthorLastName, tblBooks.AuthorFirstName, R.SKU 
FROM Items 
INNER JOIN 
    (SELECT TOP 10 Recommended.ProductCode, Recommended.SKU FROM Recommended 
    INNER JOIN Stock ON Recommended.ProductCode = Stock.ProductCode AND 
    Stock.StatusCode = 1 WHERE (Recommended.Type = 'TOPICAL') 
    ORDER BY CHECKSUM(NEWID())) 
AS Rec ON Items.ProductCode = Rec.ProductCode; 

上記は、MySQLで有効な構文で、あなたの走行距離は異なる場合があり...

0

私は通常と同じような状況の下で内部結合を使用して、必要なwhere節と追加の列から行フィルタリングを取得します。以下のようなもの。これがパフォーマンスヒットをもたらしたことであれば、クエリを反転する必要があります。お勧めから参加してアイテムに参加する。これはおそらくジョインの前にもっと多くのデータをフィルタリングするためです。

SELECT Items.Name, tblBooks.AuthorLastName, tblBooks.AuthorFirstName 
FROM Items 
Inner Join 
(
SELECT TOP 10 Recommended.ProductCode, SKUID 
FROM 
Recommended 
INNER JOIN Stock ON Recomended.ProductCode = Stock.ProductCode 
AND Stock.StatusCode = 1 
WHERE (Recommended.Type = 'TOPICAL') 
) reccomended 
on items.productcode - reccomended.ProductCode 


ORDER BY CHECKSUM(NEWID() 
関連する問題