2016-05-11 2 views
0

У меня есть две таблицы.left join, где b.key имеет значение null двумя столбцами

table_1  | table_2 
id col_1 | col_2 | col_1 | col_2 
1 1  | B  | 1  | B 
2 1  | C  | 3  | C 
3 1  | D  | 5  | D 
.... 

Я пишу этот запрос,

SELECT * 
    FROM table_1 t1 
    LEFT JOIN table_2 t2 ON t1.col_1 = t2.col_1 
    WHERE t1.col_1 = 1 
     AND (
      t2.col_1 IS NULL 
      AND t2.col_1 != 'B' 
      ) 

Я хочу, чтобы получить этот результат.

table_1   | 
id col_1 | col_2 | 
2 1  | C  | 
3 1  | D  | 

Как это сделать? Благодаря!

Update вопрос

Таблица 1 - PriceItems, Таблица 2 - BlockedPrices, col1 - код, col2 - Марка.

Я хочу, чтобы все котировки PriceItems и все марки отличались от кодов BlockesPrices.

+2

'И t2.col_1 IS NULL AND t2.col_1! = ' B'' - Я не понимаю вашу логику. Если это «NULL», естественно, это не будет «B». Можете ли вы объяснить свою логику словами? – Siyual

+0

Таблица 1 - PriceItems, Таблица 2 - Заблокированные цены, col1 - Код, col2. Я хочу получить весь код PriceItems и все бренды, кроме кодов от BlockesPrices. – Sivard

ответ

0

Я думаю это то, что вы ищете:

Select  t1.* 
From  table_1 t1 
Left Join table_2 t2 On t1.col_1 = t2.col_1 
         And t2.col_1 != 'B' 
Where  t1.col_1 = 1 
And   t2.col_1 Is Not Null 

Как я понимаю ваш вопрос, вы хотите сделать LEFT JOIN на втором столе, но есть случай, когда t2.col_1 = 'B' без от вашего конечного результата.

В этом случае вам необходимо переместить условие t2.col_1 = 'B' к вашей статье ON иметь записи, которые не соответствуют обоим LEFT JOIN условий вернуться в NULL.

Причина, по которой вы, возможно, видели странные результаты, связана с состоянием AND t2.col_1 != 'B' в вашей статье WHERE. Это приводит к тому, фильтр произойдет послеLEFT JOIN, который будет способствовать дальнейшему фильтровать эти результаты (таким образом, эффективно превращая LEFT JOIN в INNER JOIN

Edit, вопрос изменилось:.

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

Для этого вам не нужен JOIN на всех, вы можете просто сделать это с WHERE NOT EXISTS следующим образом:

Select * 
From PriceItems P 
Where Not Exists 
(
    Select * 
    From BlockedPrices B 
    Where P.Code = B.Code 
    And  P.Brand = B.Brand 
) 
And  P.Code = 1 
+0

Спасибо, что ответили. Но этот запрос не работает. Я добавляю комментарий по моему вопросу. – Sivard

+0

@Sivard Я обновил запрос – Siyual

+0

Я хочу получить все элементы из таблицы_1 с помощью table_1.col_1 = 1 и col_2 = ('B', 'C' и т. Д.), За исключением предметов из BlockesPrices. – Sivard

0

Это производит вывод, который вы хотите, и это кажется намного проще:

select t1.id, t1.col1, t1.col2 
from t1 join 
    t2 
    on t2.col2 = t1.col2 
where t1.col1 <> 'B'; 

Строго говоря, join не является необходимым, но я предполагаю, что ваша настоящая проблема сложнее.

0

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

select * 
from table_1 t1 
where not exists (
    select 1 
    from table_2 t2 
    where t1.col_1 = t2.col_1 
    and t2.col_2 = t2.col_2 
) 

Вы можете предоставить любые другие where условия во внутреннем оператора выбора, чтобы указать, какой тип соответствия следует дисквалифицировать table_1 записей из быть перечислены.

Например, вы могли бы добавить and t2.price > 2000 к внутреннему where состоянии дисквалифицировать все записи из table_1, которые соответствующие записи в table_2 с ценой выше 2000

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