2015-07-31 4 views
0

Сценарий: У меня есть 2 таблицы, а именно охват и продуктаОбъединить две таблицы, чтобы получить соответствующие записи и непарные записей из таблицы 1

Покрытие Таблица: ИДС, CNAME, CTYPE, CMessage, CDate, CoverageProductId

Таблица продукта: PId, CName, CType, CMessage, бновить, CoverageProductId

С помощью CoverageProductId я относящийся 2 таблицы.

мне нужно, чтобы получить 3 колонки CName, CMessage и CoverageProductId из обеих таблиц

Состояние Ниже

  • Получите 3 столбцов значения из таблицы Product, если соответствует и таблица CoverageProductId.
  • Получите 3 значения столбцов из таблицы покрытия, если оба таблицы CoverageProductId не совпадают.

Мой запрос ниже в SQL сервере MS

SELECT Distinct C.CoverageProductID 
,C.CName 
,C.CType 
FROM Coverage C 
INNER JOIN Product P 
ON C.CoverageProductID!=P.CoverageProductID 
UNION 
SELECT Distinct P.CoverageProductID 
,P.CName 
,P.CType 
FROM Coverage C 
INNER JOIN Product P 
ON C.CoverageProductID=P.CoverageProductID 

Но результат не как ожидалось, и он возвращает одинаковые значения.

+0

Пожалуйста, после некоторых выборочных данных и ожидаемого результата. Скрипка sql была бы лучше. –

+0

Я думаю, что логика ваших условий ничтожна. Вы хотите сохранить записи из «Coverage», которые совпадают с _and_, не совпадают в «Product». Таким образом, это означает, что вы хотите таблицу _entire_ 'Coverage'. Эта таблица также содержит, по определению, любые записи, которые соответствуют «Продукту». –

ответ

2

Я думаю, что это может делать то, что вы хотите:

select P.CoverageProductID, P.CName, P.CType 
from Product P 
where exists (select 1 
       from coverage c 
       where p.CoverageProductID = c.CoverageProductID) 
union all 
select C.CoverageProductID, C.CName, C.CType 
from Coverage C 
where not exists (select 1 
        from product p 
        where p.CoverageProductID = c.CoverageProductID); 

Он получает все строки из Product, которые соответствуют в Coverage, а затем все строки из Coverage, которые не имеют матч в Product.

+0

Упс, не заметил вашего ответа. –

0

Я попытался немного лучшим способом для одного запроса,

Ниже мой код,

SELECT 
ISNULL(P.CoverageProductID,C.CoverageProductID), 
ISNULL(P.CType,C.CType) 
ISNULL(P.CName,C.CName) 
FROM Coverage AS C 
      LEFT OUTER JOIN 
      Product AS P 
      ON C.CoverageProductID = P.CoverageProductID 
Смежные вопросы