У меня есть следующий sqlfiddle: http://sqlfiddle.com/#!15/e971e/ 10/0

Итак, я выполняю запрос к двум таблицам одновременно. Я хотел бы получить всю информацию для "Фрэн", даже если она не в 1 таблице или другой. Я имею:

WITH tableA AS(
  SELECT id, name, age 
  FROM a WHERE name = 'fran'
),
tableB AS(
  SELECT id, name, address 
  FROM b WHERE name = 'fran'
)

SELECT tableA.id, tableA.name, tableA.age, tableB.address
FROM tableA, tableB

/*
WITH tableB AS(
  SELECT id, name, address 
  FROM b WHERE name = 'fran'
)

SELECT tableB.address FROM tableB
*/

Это не возвращает строк, даже если она находится в tableB (запустите закомментированную часть, и он вернет ее адрес).

В конце я хотел бы что-то вроде:

id  name    age    address

--   --      --      2 Main
0
user_78361084 27 Фев 2018 в 00:59

4 ответа

Лучший ответ

Я вижу твою проблему, Марисса. Дело в том, что вы не присоединяетесь к столам.

    WITH tableA AS(
      SELECT id, name, age 
      FROM a WHERE name = 'fran'
    ),
    tableB AS(
      SELECT id, name, address 
      FROM b WHERE name = 'fran'
    )

    SELECT a.id, a.name, a.age, b.address
    FROM tableA a
    FULL OUTER JOIN tableB b
    ON a.id = b.id

Это вернет вам строку только с адресом Фрэн. Другие атрибуты будут пустыми, потому что у вас нет данных в таблице A.

2
Claudio Tellaeche 26 Фев 2018 в 22:59

Используйте union all!

WITH tableA AS (
      SELECT id, name, age 
      FROM a
      WHERE name = 'fran'
     ),
     tableB AS (
      SELECT id, name, address 
      FROM b
      WHERE name = 'fran'
     )
select 'a' as which, a.*
from tableA a
union all
select 'b' as which, b.*
from tableB b;

Решения join умножат количество строк в таблице. Итак, если a имеет 3 строки, а b имеет 4 строки, то результирующий набор будет иметь 12 строк. При использовании этого метода результирующий набор будет иметь 7 строк.

2
Gordon Linoff 27 Фев 2018 в 02:54

Вам нужно полное соединение плюс коалесция:

WITH tableA AS(
  SELECT id, name, age 
  FROM a WHERE name = 'fran'
),
tableB AS(
  SELECT id, name, address 
  FROM b WHERE name = 'fran'
)

SELECT COALESCE(tableA.id, tableB.id) AS id
   ,COALESCE(tableA.name, tableB.name) as name
   ,tableA.age, tableB.address
FROM tableA FULL JOIN tableB
ON tableA.id = tableB.id
1
dnoeth 26 Фев 2018 в 22:16

Вам нужно полное внешнее соединение.

Исходя из вашего sqlfiddle, идентификатор не подходит для объединения (идентификатор 2 fred в таблице A и fran в таблице B), вместо этого вам нужно использовать столбец name. Вы должны убедиться, что имя проиндексировано для правильной работы.

SELECT
  a.id, a.name, a.age,
  b.id, b.name, b.address
FROM a
FULL OUTER JOIN b ON b.name = a.name
WHERE a.name = 'fran' or b.name = 'fran'
1
Oliver Hanappi 26 Фев 2018 в 22:06