Получение значений для нулей из двух разных таблиц? - PullRequest
2 голосов
/ 17 марта 2011

У меня есть большая таблица (главная), например, так:

person_id    fee        ref_id    <otherfields>
1           foo        23
1            bar        null
1            abc        23
2            xyz        34

Многие из значений для ref_id являются нулевыми, которые мне нужно получить.Кстати, мне нужно выбрать, а не обновлять.У меня есть две другие таблицы d1, d2, которые содержат необходимый отсутствующий ref_id (вместе с другими полями), и на них можно ссылаться, используя person_id.Возможно, person_id не существует ни в одной из таблиц (например, он не может быть в d1, но в d2)

Я могу заполнить часть ref_id, используя одну из таблиц, но как мне тогдаиспользовать другую таблицу для получения значений для оставшихся нулей?Союз звучит правильно для меня?Но я борюсь с этим, так как он дает мне больше строк, чем у меня было изначально, что не может быть правильным.

SQL Server 2008

edit: d1, d2 имеют одинаковый (person_id, ref_id) кортеж

Ответы [ 3 ]

4 голосов
/ 17 марта 2011

Вы хотите объединение, и вы, вероятно, хотите использовать COALESCE, например:

SELECT person_id, fee,
   COALESCE (m.ref_id, d1.ref_id, d2.ref_id) as 'ref_id',
   ...
FROM table t
LEFT JOIN d1
  ON d1.person_id = t.person_id
LEFT JOIN d2
  ON d2.person_id = t.person_id
WHERE ...

Это даст вам первое значение Non-NULL для ref_id из этих 3 таблиц.

Редактировать:

Чтобы уточнить, о чем вы думали, UNION соединяет наборы данных или таблицы по вертикали, как в

SELECT 1,2,3
UNION
SELECT 4,5,6

.

1,2,3
4,5,6

A JOIN соединяет таблицы по строке, связывая строку в одной таблице со строкой в ​​другой таблице, чтобы «расширить» строку значениями из обеих таблиц.

1 голос
/ 17 марта 2011

Ответ JNK - лучший, я думаю.Но просто для того, чтобы продемонстрировать другой подход, вы можете сделать это как единое объединение с UNION.В зависимости от набора данных один или другой метод может быть более эффективным.

SELECT person_id, fee,
   COALESCE (m.ref_id, d.ref_id) as 'ref_id',
   ...
FROM table t
LEFT JOIN (SELECT person_id, ref_id FROM d1 UNION ALL SELECT person_id, ref_id FROM d2) d
  ON d.person_id = t.person_id

Если d1 и d2 имеют строки для одного и того же person_id, это вернет больше строк, чем в исходной таблице.Если они имеют одинаковый (person_id, ref_id) кортеж, то замена UNION ALL на простой UNION должна решить эту проблему;в противном случае вам нужно быть более конкретным в своем вопросе, поскольку вы можете получить разные результаты от d1 или d2.

0 голосов
/ 17 марта 2011

Что-то вроде ниже.Обратите внимание, что вы все равно можете получить больше строк, чем в основной таблице, если любой из d1 или d2 имеет несколько строк для одного и того же person_id.Если нет, это не должно дать вам больше строк.

Select
      m.*
    , d1.*
    , d2.*
From
    main m
Left Join
    d1
On
    m.person_id = d1.person_id
    And
    m.ref_id Is Null
Left Join
    d2
On
    m.person_id = d1.person_id
    And
    m.ref_id Is Null
    And
    d1.ref_id Is Null
...