Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите составить запрос!  [new]
rigorMortis
Member

Откуда:
Сообщений: 283
привет
Есть родительская таблица

Table1
(
id int primary key not null,
name varchar(20) not null
)


и дочерняя

Table2
(
id int primary key not null,
name varchar(20) not null,
Table1Id int not null, //внешний ключ на Table1.
)


В дочерней таблице могут быть не более 2х записей для одного Table1Id. Значениями name в Table2 могут быть либо 'A' либо 'B'. Мне нужно эти две записи из Table2 выстроить в два столбца, присоединённых к Table1. При этом, если для какого-то Table1.id записи в Table1 нет то пишем null. Пытаюсь так:

CREATE VIEW Table1View AS 
  SELECT
    t1.*,
    CASE
      WHEN EXISTS (SELECT 1 FROM Table2 t2 WHERE t2.name = 'A' AND t2.Table1Id = t1.id) THEN 'A'
      ELSE NULL
    END AS A,
    CASE
      WHEN EXISTS (SELECT 1 FROM Table2 t2 WHERE t2.name = 'B' AND t2.Table1Id = t1.id) THEN 'B'
      ELSE NULL
    END AS B
  FROM Table1 t1


Но что-то данные возвращаются некорректные. Правильно ли составлен запрос? Я расчитывал что для каждого t1.id будет проверено есть ли для него запись в Table2 с name='A' и\или 'B' и в зависимость от этого будет установлен о соответствующее значение для соответствующего столбца либо null.
Видимо неправильно, так как это больше похоже на работу курсора, а здесь его нет. Как сделать-то?
22 дек 14, 00:20    [17031409]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить запрос!  [new]
o-o
Guest
rigorMortis,
приведите пример данных, на к-ых по-вашему некорректно отрабатывает.
вроде нормально написано.
могу предложить другой вариант того же самого, у меня оба одно и то же возвращают
declare @Table1 table
(
id int primary key not null,
name varchar(20) not null
);

declare @Table2 table
(
id int primary key not null,
name varchar(20) not null,
Table1Id int not null
);

insert into @Table1 (id, name)
values (1, 'n1'), (2, 'n2'), (3, 'n3'), (4, 'n4');

insert into @Table2 (id, name, Table1Id)
values (-1, 'A', 1), (-2, 'B', 2), (-3, 'A', 3), (-4, 'B', 3);

with cte as
(
select Table1Id, [A], [B]
from @Table2 pivot (min(id) for name in ([A], [B]))p
)

select t1.id, t1.name, 
       case 
          when c.A is not null then 'A'
       end as A, 
       case 
          when c.B is not null then 'B'
       end as B 
from @Table1 t1 left join cte c on t1.id = c.Table1Id;
---
id	name	A	B
1	n1	A	NULL
2	n2	NULL	B
3	n3	A	B
4	n4	NULL	NULL
22 дек 14, 01:13    [17031583]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить запрос!  [new]
rigorMortis
Member

Откуда:
Сообщений: 283
o-o, даже не знаю, этот пример адаптировал для форума, он сильно отличается набором полей и таблиц. На самом деле там было три таблицы многие ко многим. Не знаю, попробовал этот пример - действительно работает.
22 дек 14, 01:54    [17031621]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить