SQL это эквивалент левого соединения? - PullRequest
3 голосов
/ 08 марта 2010

Это эквивалентно LEFT JOIN?

SELECT DISTINCT a.name, b.name 
  FROM tableA a, 
       (SELECT DISTINCT name FROM tableB) as b

Кажется, что нет никакой связи между двумя таблицами.

Есть ли более простой / эффективный способ написать это?

Ответы [ 5 ]

4 голосов
/ 08 марта 2010

Нет, это эквивалентно перекрестному или декартовому соединению (очень плохое) с отчетливым применением впоследствии. Довольно сложно понять, что вы действительно хотите с помощью запроса в его нынешнем виде.

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

Я ненавижу стигму, которую люди применяют к декартовым объединениям. Они замечательные при правильном использовании . У меня есть заявление на выплату заработной платы, и мы должны применять различные налоговые органы к каждому сотруднику. Итак, у меня есть одна таблица сотрудников и одна таблица налоговых органов.

В любом случае .. Я просто хотел защитить прекрасное декартово соединение. (

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

Это синтаксис ANSI-89 для перекрестного соединения, дающего декартово произведение (это плохо).Переписано с использованием синтаксиса ANSI-92 JOIN:

Если на SQL Server / Oracle / Postgres , используйте:

    SELECT DISTINCT
           a.name,
           b.name
      FROM TABLEA a
CROSS JOIN (SELECT b.name 
              FROM TABLEB b) AS b

MySQL поддерживаетиспользуя:

SELECT DISTINCT
       a.name,
       b.name
  FROM TABLEA a
  JOIN (SELECT b.name 
          FROM TABLEB b) AS b

Нам нужно знать, существует ли какой-либо столбец (столбцы) для привязки записей между двумя таблицами друг к другу, чтобы обновить запрос для использования INNER JOIN или OUTER JOIN.

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

Разве это не то же самое, что

SELECT DISTINCT a.name, b.name
    FROM tableA a, tableB b

хотя я бы поставил под сомнение цель этого запроса.

1 голос
/ 08 марта 2010

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

Сделай это. Проверьте количество записей, которые вы получаете. Затем напишите левое объединение в названии компании (или в качестве идентификатора компании, которое вам действительно нужно использовать в качестве поля объединения, поскольку названия компаний часто меняются). Могу поспорить, вы получите другое количество записей. Я сделал это, будет две таблицы, которые мне пригодились, и вот что я получил: Таблица А имела 467 записей Таблица б имела 4413 записей Перекрестное соединение имело 2060871 Перекрестное соединение с отличным составом 826804 У левого соединения было 4712 Внутреннее соединение было 893

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

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