2016-07-04 2 views
0

У меня есть две таблицы с одинаковыми столбцами, мне нужно сделать выбор в этих двух таблицах, я хочу знать, как наилучшим образом это сделать, мой критерий выбора:Выполните выбор из двух таблиц с одинаковыми столбцами

SELECT  
    ISNULL(LoteDet.IdLoteDet, LoteDetPg.IdLoteDet) AS Expr1, 
    ISNULL(LoteDet.IDSac, LoteDetPg.IDSac) AS Expr2, 
    ISNULL(LoteDet.Comprom, LoteDetPg.Comprom) AS Expr3, 
    ISNULL(LoteDet.NossoNum, LoteDetPg.NossoNum) AS Expr4, 
    ISNULL(LoteDet.NossoNumDig, LoteDetPg.NossoNumDig) AS Expr5 
FROM 
    LoteDet 
CROSS JOIN 
    LoteDetPg 
WHERE 
    Expr1 = 500 

Это можно сделать?

Как это лучший способ для выполнения такого рода выбора, если не найдено значение в одной таблице, то значение будет в другой таблице ....

------ EDIT

Возможно, создать представление является хорошей альтернативой этому типу выбора?

+2

Вы уверены, что нуждаетесь в декартовом продукте? –

+1

Не могли бы вы показать ожидаемый результат? –

ответ

0

Использование COALESCE:

SELECT  
    COALESCE(LoteDet.IdLoteDet, LoteDetPg.IdLoteDet) AS Expr1, 
    COALESCE(LoteDet.IDSac, LoteDetPg.IDSac) AS Expr2, 
    COALESCE(LoteDet.Comprom, LoteDetPg.Comprom) AS Expr3, 
    COALESCE(LoteDet.NossoNum, LoteDetPg.NossoNum) AS Expr4, 
    COALESCE(LoteDet.NossoNumDig, LoteDetPg.NossoNumDig) AS Expr5 
FROM 
    LoteDet 
CROSS JOIN 
    LoteDetPg 
WHERE 
    Expr1 = 500 

Посмотрите на эту документацию: https://msdn.microsoft.com/pt-br/library/ms190349.aspx

0

Я считаю, что это собирается вернуть вам то, что называется декартовым произведением. Это результат открытого соединения, как и у вас выше. Этот запрос будет возвращать TONS записей, потому что вы не укажете, как подключиться к двум таблицам, он просто собирается вслепую попробовать сопоставить столбцы. По крайней мере, добавьте условие ON в JOIN, чтобы вы могли сопоставлять идентификаторы/ключи. Я думаю, что вы хотите, это INNER JOIN с ON; это вернет вам все соответствующие строки на основе ID/Key.

SELECT 
    CASE WHEN tbl1.Comprom IS NULL THEN tbl2.Comprom ELSE tbl1.Comprom END AS Expr1 
    CASE WHEN tbl1.Nossonum IS NULL THEN tbl2.Nossonum ELSE tbl1.Nossonum END AS Expr2 
FROM 
    tbl1 --LoteDet 
    INNER JOIN tbl2 --LoteDetPg 
     ON (tbl1.ID = tbl2.ID) 
WHERE 
    Expr1 = 500 --I know I swapped the expression values, use whichever expression you need here 

Теперь только те строки, которые имеют соответствующий идентификатор будет возвращать вам значения, и он будет использовать значение из tbl1, если оно не равно нулю, то он будет использовать значение из tbl2.

Редактировать: Я знаю, что CROSS JOIN превращается в INNER JOIN, если указано WHERE, но нужно ли WHERE включать обе таблицы? Я чувствую, что Expr1 = 500 все равно будет производить декартовский продукт; может кто-то поправить меня?

Смежные вопросы