2016-07-21 5 views
0

Я застрял в ситуации, когда мне нужно выполнить условное соединение. Краткое резюме может быть, у меня есть 2 таблицы TableA и TableB.Отменить условие соединения на основе значения столбца

TableA имеет столбцы A1, A2, A3, A4, A5, Condition1, Condition2

аналогично TableB имеет столбцы B1, B2, Condition1, Condition2

И мне нужно, чтобы выполнить объединение на TableA.Condition1 = TableB.Condition1 и состояния присоединиться на TableA.Condition2 = TableB.Condition2, состояние TableA.Condition2 не должно быть нулевым для любой записи первого соединения.

Другими словами, если какая-либо запись с TableA.Condition1 = TableB.Condition1 согласована и в то же время TableA.Condition2 не является ни для кого из них, а затем выполняет второе соединение, в противном случае не выполняется второе соединение.

Запрос может быть как

SELECT A.* FROM TableA A 
INNER JOIN TableB B 
ON A.Condition1 = B.Condition1 -- This must be perform 
AND WHEN A.Condition2 IS NULL THEN 
1 = 1 -- Assuming no join here 
ELSE 
A.Condition2 = B.Condition2 -- perform join 
END 
+0

Ваша обфускация a ctual details, вероятно, усложняет любые реальные решения. Если вы можете предоставить не конфиденциальную/личную информацию, и фактическая контекстная таблица/столбцы определенно помогут. – DRapp

ответ

0

Вы только выбрать из TableA, так как об использовании exists вместо этого?

SELECT A.* 
FROM TableA A 
WHERE (A.Condition2 IS NULL AND 
     EXISTS (SELECT 1 FROM TableB b WHERE A.Condition1 = B.Condition1) 
    ) AND 
     (A.Condition2 IS NOT NULL AND 
     EXISTS (SELECT 1 FROM TableB b WHERE A.Condition1 = B.Condition1 AND A.Condition2 = B.Condition2) 
    ); 

Или, если вы хотите JOIN:

SELECT A.* 
FROM TableA A JOIN 
    TableB B 
    ON A.Condition1 = B.Condition1 AND 
     (A.Condition2 IS NOT NULL OR A.Condition2 = B.Condition2); 
+0

Говоря о соединении, я сказал, что если какое-либо значение для Condition2 таблицы A не равно null, то это соединение должно быть выполнено. Ваш вопрос всегда выбирает данные, когда они равны нулю, хотя в немногих записях это значение равно null. – Imad

0

Попробуйте это может помочь вам

SELECT A.* 
FROM TableA A 
INNER JOIN TableB B ON A.Condition1 = B.Condition1 AND 
         ((A.Condition2 IS NOT NULL AND A.Condition2 = B.Condition2) 
         OR (A.Condition2 IS NULL)) 
+0

Я уже говорил о том, что если какое-либо значение для условия2 таблицы А не равно нулю, то это соединение должно выполняться. Ваш вопрос всегда выбирает данные, когда они равны нулю, хотя в немногих записях это значение равно null. – Imad

+0

@Imad Я обновил Ans, попробуйте, дайте мне знать, если это поможет вам –

+0

Все тот же результат :( – Imad

0

трудно понять ваш вопрос и еще труднее понять цель

SELECT A.* 
-- join table1 and table2 on Condition1 
FROM TableA A 
JOIN TableB B ON A.Condition1 = B.Condition1 
-- if max condition2 is null then there is nothing but nulls 
JOIN (SELECT MAX(Condition2) Condition2 FROM TableA A2) A2 
-- in that case every row resulting from join1 goes 
ON A2.Condition2 IS NULL 
-- otherwise use condition2 but replace nulls with some placeholder 
-- or maybe you have either all null or no nulls 
OR COALESCE (A.Condition2,'null') = COALESCE (B.Condition2,'null') 
; 
Смежные вопросы