2015-01-20 4 views
2

Я пытаюсь запустить левое соединение на 2 столах. У меня нет группы, и только там, где условие у меня есть на второй таблице. Но возвращаемые строки меньше, чем первая таблица. не означает ли левое объединение, чтобы привести все данные из первой таблицы? Вот мой SQL:sql left join возвращает

select * 
    from tbl_a A left join tbl_b B 
    ON 
     A.Cnumber=B.Cnumber 
     and A.CDNUmber=B.CDNumber 
     and abs(A.duration - B.Duration)<2 
     and substr(A.text,1,3)||substr(A.text,5,8)||substr(A.text,9,2)=substr(B.text,1,8) 
where B.fixed = 'b580' 

Есть 140000 записей в таблице А, но результат возвращается менее чем 100000 записей. В чем проблема и как я могу ее решить?

+0

моя основная проблема здесь заключается в том, чтобы получить точные 140000 записей в результате, некоторые из которых имеют записи tbl_b, если условия совпадают, а некоторые dont –

+0

на самом деле я не могу дать образцы, но как пример: рассмотрим сопоставление 2 списка в школе , один для всех студентов, созданных школой. и другой, созданный соответствующим министерством. в списке министерства больше записей. Я хочу узнать, какие записи в списке служения нет в нашем списке. ни одна из таблиц не имеет первичного ключа, а четыре столбца вместе могут сделать запись уникальной. –

ответ

4

Как только вы поставили условие в предложении WHERE, который ссылается на правильную таблицу и не вместить NULL S, которые будут выпускаться, когда соединение является неудачным, вы превратили его (эффективно) обратно в INNER JOIN ,

Try:

where B.fixed = 'b580' OR B.fixed IS NULL 

Или добавить это условие к статье ON для JOIN.

+0

Я перенесла условие из [где] в [ВКЛ]. количество записей увеличилось до 280000. Я думаю, у меня может быть несколько совпадений. я прав? –

+0

Да, это звучит вероятно. Если вы не видите результаты, которые вы * хотите *, можете ли вы обновить свой вопрос с помощью выборочных данных и результатов, которые вы пытаетесь достичь? –

+0

I tbl_c и вставил объединенные результаты в него, а затем я попробовал этот код, чтобы удалить дубликаты в результатах: выберите count (*) из tbl_C, где rowid not in (выберите min (rowid) из tbl_c group, Cnumber1, CDNUmber2, duration1 , text1, результат поступил в 150000 записей, почему он еще больше, чем первая таблица? –

0

Вы должны добавить ИНЕКЕ объединения:

select * 
    from tbl_a A left join tbl_b B 
    ON 
     A.Cnumber=B.Cnumber 
     and A.CDNUmber=B.CDNumber 
     and abs(A.duration - B.Duration)<2 
     and substr(A.text,1,3)||substr(A.text,5,8)||substr(A.text,9,2)=substr(B.text,1,8) 
    and B.fixed = 'b580' 

Если вы используете где statemen все записи, где б не существующие не будут возвращены.

+0

У меня теперь есть дополнительные записи, даже удаляя дубликаты в новом списке.?!?! –

+0

Можете ли вы добавить некоторые данные образца? – Jens

+0

На самом деле я не могу дать образцы, но как пример: рассмотрим сопоставление 2 списка в школе. один для всех студентов, созданных школой. и другой, созданный соответствующим министерством. в списке министерства больше записей. Я хочу узнать, какие записи в списке служения нет в нашем списке. ни одна из таблиц не имеет первичного ключа, а четыре столбца вместе могут создавать уникальные столбцы записи, что делает запись уникальной. –