SQL-запрос без внешнего ключевого слова соединения - PullRequest
1 голос
/ 13 апреля 2011

Можно ли написать SQL-запрос, если вы знаете, что должны использовать левое внешнее соединение ... но не можете или не можете использовать ключевое слово "внешнее соединение"

У меня две таблицы sand, чтобы получить строки с нулевыми значениями из левой таблицы ... это довольно просто ... но я не должен использовать ключевое слово .... external join .... Мне нужно чтобы исправить логику внешнего соединения

Ответы [ 5 ]

3 голосов
/ 13 апреля 2011
;WITH t1(c,d) AS
(
SELECT 1,'A' UNION ALL 
SELECT 2,'B'
),t2(c,e) AS
(
SELECT 1,'C' UNION ALL 
SELECT 1,'D' UNION ALL 
SELECT 3,'E'
)

SELECT t1.c, t1.d, t2.c, t2.e
FROM t1, t2 
WHERE t1.c = t2.c
UNION ALL
SELECT t1.c, t1.d, NULL, NULL
FROM t1 
WHERE c NOT IN (SELECT c 
                FROM t2 
                WHERE c IS NOT NULL)

Возвращает

c           d    c           e
----------- ---- ----------- ----
1           A    1           C
1           A    1           D
2           B    NULL        NULL          

(эквивалентно)

SELECT t1.c, t1.d, t2.c, t2.e
FROM   t1
       LEFT JOIN t2
         ON t1.c = t2.c  
3 голосов
/ 13 апреля 2011
SELECT Field1 
FROM table1 
WHERE id NOT IN (SELECT id FROM table2)

SELECT Field1 
FROM table1 
WHERE NOT EXISTS (SELECT * FROM table2 where table2.id = table1.id)

Это то, что люди делают, но это устарело, и в настоящее время оно работает некорректно (иногда оно возвращает перекрестное соединение вместо левого), поэтому его НЕ следует использовать. Я говорю это только для того, чтобы вы не использовали это решение.

SELECT Field1 
FROM table1, table2 where table1.id *= table2.id
0 голосов
/ 26 апреля 2013

Возвращает все совпадающие строки из обеих таблиц:

    SELECT a.*,b.* FROM table_a a, table_b b
    WHERE a.key_field = b.key_field

Потенциальный недостаток - несоответствия будут пропущены.

0 голосов
/ 13 апреля 2011

Это даст вам все строки в таблице A, у которых нет соответствующей строки в таблице B:

SELECT * 
FROM A
WHERE NOT EXISTS (
  SELECT 1
  FROM B
  WHERE A.id = B.id
);
0 голосов
/ 13 апреля 2011

Для SQL Server вы можете просто использовать LEFT JOIN - OUTER является необязательным, как INTO в операторе INSERT.

Это то же самое для всех OUTER JOIN s,

Для INNER JOIN вы можете просто указать JOIN без квалификаторов, и это будет интерпретировано как INNER JOIN.

...