Присоединяйся к таблице без двух запросов - PullRequest
2 голосов
/ 08 марта 2012

Я видел людей, которые рекомендовали кросс-присоединение к таблице, делая это:

SELECT *
FROM tbl AS A, tbl AS B
WHERE A.col1 = 1 AND B.col1 = 1

Но здесь движок должен дважды пройти по всем строкам в таблице tbl, чтобы сопоставить два запроса с результатами A и B, несмотря на то, что запросы (и, следовательно, результаты) одинаковы. *

Предполагая, что WHERE на A и B всегда будет одинаковым для двух, это пустая трата времени. Есть ли способ запросить что-то один раз, а затем перекрестно соединить результат этого запроса с самим собой? Я бы хотел избежать временных таблиц, которые потребовали бы записи на диск вместо выполнения всей этой операции в оперативной памяти.

Я использую MySQL, хотя любой ответ на SQL очень помог бы.

Пример:

Предположим, что таблица выглядит следующим образом:

COL1    COL2
1       A
1       B
1       C
2       D
2       E

Когда я запускаю условие where из col1 = 1, оно возвращает первые три строки из приведенной выше таблицы. Мне нужна следующая таблица, но только с одним выполнением оператора where, поскольку две таблицы A и B идентичны:

A.COL1    A.COL2    B.COL1    B.COL2
1         A         1         A
1         A         1         B
1         A         1         C
1         B         1         A
1         B         1         B
1         B         1         C
1         C         1         A
1         C         1         B
1         C         1         C

Ответы [ 2 ]

2 голосов
/ 08 марта 2012

Вы в основном запрашиваете преднамеренное декартово объединение

select
      a.col1,
      a.col2,
      b.col1,
      b.col2
   from
      tbl a
         join tbl b
            on a.col1 = b.col1
   where
      a.col1 = 1
   order by
      a.col2,
      b.col2

Чтобы точно попасть в вашу последовательность выходных ордеров, вам нужно упорядочить по столбцу "a" 2, а затем по столбцу "b" 2

0 голосов
/ 08 марта 2012

Я действительно рекомендую избегать синтаксиса JOIN ... его может быть очень трудно прочитать.

Ваше объяснение того, что вы пытаетесь сделать, немного загадочно.Написанный запрос не предлагает значения для операции JOIN.Вообще говоря, когда вы хотите присоединить таблицу к себе, она находится в разных столбцах:

select *
from tbl as a
inner join
table as b
on a.col1 = b.col2
where 
a.col1 = 1;

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

create table tbl (
person_id int,
parent_id int
);

В этом случае родитель - это тоже человек.Если вы хотите получить список родителей, связанных с человеком с идентификатором 1, вы можете написать:

select
person.person_id as OriginalPerson,
parent.person_id as Parent
from
tbl as person
inner join
tbl as parent
on parent.person_id = person.person_id
where
person.person_id = 1;

ОБНОВЛЕНИЕ Прочитав ваше дальнейшее объяснение, вы хотите получить декартовупродукт:

select a.*, b.*
from tbl as a
inner join tbl as b
on 1=1
where a.col1 = 1
and b.col1 = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...