2012-01-26 21 views
0

FYI - このクエリはExcelから実行されます。私は、日付範囲を設定するためのプロンプトフィールドを持っています。ここ SQL ServerクエリINNER JOIN - エントリがありません

は私が誰かからもらったオリジナルの作業クエリです:

SELECT 
    SalesInvoiceItems.FreeTextItem, SalesInvoiceItems.Product, 
    SalesInvoiceItems.ItemDescription, SalesInvoiceItems.Quantity, 
    SalesInvoiceItems.ItemValue, Customers.CustomerId, Customers.CustomerName, 
    SalesInvoices.SalesInvoiceId, SalesInvoices.EffectiveDate, Countries.CountryId, 
    SalesInvoiceItems.ItemType 
FROM 
    Winman.dbo.Countries Countries, Winman.dbo.Customers Customers, 
    Winman.dbo.Products Products, Winman.dbo.SalesInvoiceItems SalesInvoiceItems, 
    Winman.dbo.SalesInvoices SalesInvoices 
WHERE 
    Customers.Customer = SalesInvoices.Customer 
    AND SalesInvoiceItems.SalesInvoice = SalesInvoices.SalesInvoice 
    AND Customers.Country = Countries.Country 
    AND ((SalesInvoices.SystemType='F') 
    AND (SalesInvoiceItems.ItemType<>'T') 
    AND (SalesInvoices.EffectiveDate>=? And SalesInvoices.EffectiveDate<=?) 
    AND (SalesInvoiceItems.ItemValue<>$0)) 
ORDER BY 
    SalesInvoiceItems.Quantity DESC 
ここ

重要ビットであるItemType(それが唯一のTをすることができ、ウィッヒが除外され、P - 製品とNのために - フリーテキスト項目について)

テーブルProductsを追加して、ProductIDを取得する必要がありました。もちろんWHERE句内のコードの下に追加:

AND Products.Product = SalesInvoiceItems.Product 

インクルードは製品ではないとして、任意のフリーテキスト項目を起動に失敗します。

だから私はそれが(エントリの両方のPおよびNタイプを育てる)私の問題を解決することを望んで参加してクエリを書き直し:

SELECT 
    Products.ProductId, 
    SalesInvoiceItems.FreeTextItem, 
    SalesInvoiceItems.Product, 
    SalesInvoiceItems.ItemDescription, 
    SalesInvoiceItems.Quantity, 
    SalesInvoiceItems.ItemValue, 
    Customers.CustomerId, 
    Customers.CustomerName, 
    SalesInvoices.SalesInvoiceId, 
    SalesInvoices.EffectiveDate, 
    Countries.CountryId, 
    SalesInvoiceItems.ItemType 
FROM 
    Winman.dbo.SalesInvoiceItems AS SalesInvoiceItems 
INNER JOIN 
    Winman.dbo.Products AS Products ON Products.Product = SalesInvoiceItems.Product 
INNER JOIN 
    Winman.dbo.SalesInvoices AS SalesInvoices ON SalesInvoices.SalesInvoice= SalesInvoiceItems.SalesInvoice 
INNER JOIN 
    Winman.dbo.Customers AS Customers ON Customers.Customer = SalesInvoices.Customer 
INNER JOIN 
    Winman.dbo.Countries AS Countries ON Countries.Country = Customers.Country 
WHERE 
    ((SalesInvoices.SystemType='F') 
    AND (SalesInvoiceItems.ItemType<>'T') 
    AND (SalesInvoices.EffectiveDate >= ? And SalesInvoices.EffectiveDate <= ?) 
    AND (SalesInvoiceItems.ItemValue <> $0) 
    ) 
ORDER BY 
    SalesInvoiceItems.Quantity DESC 

が、これはまだとして機能し、 - フリーテキスト項目を無視しています!私は明らかに何かが欠けている..どのようにフリーテキストの項目には、ProductIDを持っていないにもかかわらず、両方の製品とフリーテキスト項目をもたらすことができますか?

答えて

2

古いクエリは旧式のJOIN構文を使用しています。明示的な結合のためにこの暗黙の(内部の)結合を完全に放棄することは良いことです。

明示的に使用して、あなたが今INNEROUTER合流(ref. MSDN)の間選択肢を持って、参加します。

内部結合は、結合条件に一致する両方のテーブルの テーブルの少なくとも1つの行がある場合にのみ行を返します。内部結合は、他のテーブルの行と一致しない行 を削除します。 外部結合 ただし、WHEREまたは HAVINGの検索条件を満たす限り、FR​​OM句に記載されているテーブルまたはビューのうちの少なくとも1つからすべての行を返します。

だから、あなたの質問に応じて、LEFT JOIN

+0

はいコース!!!私はそれについても考えなかった!私はそれを受け入れるようにマイクロソフトのクエリと戦わなければならなかった... – Elen

0

ない私が正しく理解しますが変更してみてください確認してくださいにあなたのINNER JOIN秒を変更:

INNER JOIN Winman.dbo.Products AS Products ON ... 

へ:の

LEFT JOIN Winman.dbo.Products AS Products ON ...