2013-12-23 2 views
2

у меня есть, что sql:Различные результаты подсчета с присоединиться

SELECT DISTINCT 
    count(KTT) 
FROM 
    TRA.EVENT; 

возвращает мне несколько 1901335.

Теперь я хочу расширить SQL с join как это:

SELECT DISTINCT 
    count(E.KTT) 
FROM 
    TRA.EVENT E 
LEFT JOIN TRA.TMP_BNAME TBN ON E.KTT = TBN.KTT_DEF; 

Но здесь у меня есть результат 1942376.

I dont unde Почему? Я ожидаю также результат 1901335. Я думал, что легко join значения от TBN на основании записей EVENT?

EDIT

SELECT DISTINCT 
    E.KTT, 
    TB.B_BEZEICHNER 
FROM 
    TRA.EVENT E 
LEFT JOIN TRA.TMP_BNAME TBN ON E.KTT = TBN.KTT_DEF 
LEFT JOIN TRA.TMP_B TB ON TBN.B_ID = TB.B_ID; 

Что я делаю неправильно?

Thx для вашей помощи. Stefan

ответ

4

Вы не указали полную информацию, так что рассматривайте эти комментарии как общие.

Когда вы присоединяетесь к 2 столам, может случиться так, что он может создавать «дубликаты» строк из одной таблицы. В вашем случае может быть более 1 записи с тем же KTT_DEF в таблице TRA.TMP_BNAME. Когда вы присоединитесь к таблице TRA.EVENT, она создаст более одной записи для каждой оригинальной записи в таблице TRA.EVENT.

Вы можете выбрать для подсчета различных значений KTT от TRA.EVENT и использовать DISTINCT ключевое слово, но вы должны положить его в COUNT: SELECT COUNT(DISTINCT E.KTT). Это будет работать при условии, что ваши ценности действительно уникальны. Если это не так, то счет будет отличаться от первого запроса.

+0

нормально, я понимаю. Как я могу избежать этого? –

+1

@StefanBeike - Что вы пытаетесь сделать с «LEFT JOIN» в любом случае? Кажется бессмысленным, если вы не делаете этого для эффекта умножения строк. –

+0

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

2

Вы хотите сосчитать отличный KTT? Тогда ваш код неверен. Вы должны использовать:

SELECT  count(DISTINCT KTT) 
FROM TRA.EVENT; 

Вы получаете разные счета, потому что считаете каждую строку. Не отдельные. И поскольку соединение добавляет больше строк в запрос, поэтому вы получаете большее число.

1

Попробуйте это:

SELECT COUNT(DISTINCT E.KTT) 
FROM TRA.EVENT E 
LEFT JOIN TRA.TMP_BNAME TBN ON E.KTT = TBN.KTT_DEF; 
Смежные вопросы