SQL: Почему я вдруг получаю еще 2 миллиона строк из этого оператора? - PullRequest
1 голос
/ 04 февраля 2011

Исходное утверждение:

Select
     A.a,
     B.b
FROM
     A,
     B
WHERE
     A.c = B.C

Я добавляю это и получаю еще 2 миллиона строк:

Select
     A.a,
     B.b,
     C.d
FROM
     A,
     B,
     C
WHERE
     A.c = B.C
     AND
     C.c = A.c

Таблица CI, которую я пытаюсь добавить, содержит только 55 000 строк. Где какдве другие таблицы намного больше.

Ответы [ 4 ]

6 голосов
/ 04 февраля 2011

Вы получаете перекрестный продукт, а не делаете реальное соединение.Это чрезвычайно дорого.

Я бы порекомендовал переписать его так:

select a.a, b.b, c.d
from a
join b on a.c = b.c
join c on c.c = a.c

Это будет значительно быстрее и, вероятно, даст вам результаты, которые вы ищете.

5 голосов
/ 04 февраля 2011

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

Я бы переписал его, используя более понятный и более явный синтаксис соединения нового стиля:

SELECT A.a, B.b, C.d
FROM A
JOIN B on A.c = B.c
JOIN C on A.c = C.c
1 голос
/ 04 февраля 2011

при использовании синтаксиса объединения

FROM A, B, C

ваш набор результатов будет продуктом

строк из A * # строк из B * # строк из C

поэтому, если в каждой таблице по 1000 строк, ваш набор результатов будет иметь 1 000 000 000 строк

0 голосов
/ 04 февраля 2011

хм ... Я не уверен, что вы пытаетесь сделать, но вы, скорее всего, хотите сделать что-то подобное, чтобы C.c тоже совпадал с B.C ... посмотрите код ниже:

Select
     A.a,
     B.b,
     C.d
FROM
     A,
     B,
     C
WHERE
     A.c = B.C
     AND
     C.c = A.c
     AND
     C.c = B.C

Ваш код пытается присоединиться к B, C по отдельности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...