2012-01-26 4 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 

не сможет вызвать любой свободный текстовый элемент, так как не являются продуктами.

Так что я переписал запрос с JOINS надеясь, что решить мою проблему (воспитывает как 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 

, но это все еще действует как AND - который игнорирует бесплатные текстовые элементы! Я, очевидно, что-то пропустил. Как я могу принести оба продукта и бесплатные текстовые элементы, несмотря на то, что в бесплатных текстовых элементах нет ProductID?

ответ

2

Ваш старый запрос использует старый стиль JOIN синтаксис. Хорошо, что полностью отказаться от этого неявного (внутреннего) присоединения в пользу явного присоединения.

При использовании явного соединения, теперь у вас есть выбор между INNER и OUTER присоединяется (ref. MSDN).

Внутренние соединения возвращают строки только в том случае, если имеется как минимум одна строка из обеих таблиц , которая соответствует условию объединения. Внутренние соединения исключают строки , которые не соответствуют строке из другой таблицы. Внешние соединения, однако возвращают все строки из по меньшей мере одной из таблиц или представлений , упомянутых в предложении FROM, если эти строки удовлетворяют любым WHERE или условиям поиска.

Таким образом, в ответ на ваш вопрос, изменить INNER JOIN с до LEFT JOIN s

+0

да, курс!!! Я даже не думал об этом! хотя мне пришлось сражаться с запросом microsoft, чтобы он принял его ... – Elen

0

Не уверен, что я правильно понимаю, но попробуйте изменить:

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

к:

LEFT JOIN Winman.dbo.Products AS Products ON ... 
Смежные вопросы