SQL - объединить три таблицы с предложением "где" - PullRequest
0 голосов
/ 16 мая 2019

Я хочу написать SP, который я буду использовать в моей программе на c #. У меня есть три таблицы: Table1 (id pk, name, ...), Table2 (id PK, name, ...) и Table3 ((idT1, idT2) PK FK). Таким образом, таблица 3 моделирует отношения n: n между таблицей 1 и таблицей 2.

Я хочу получить все имена Table2.name, связанные с одним Table1.name.

Я уже пытался написать запрос с двумя внутренними объединениями

    CREATE PROCEDURE slct
    @name nvarchar(50)

    AS
    BEGIN
    SET NOCOUNT ON;
    SELECT Table2.name from Table2  
    join Table3 on Table2.id = Table3.idT2 join Table1 on Table1.id = Table3.idT1 where Table1.name = '%'+@name+'%'

    END
    GO

Table1
|1|abc|
|2|def|

Table2
|1|xyz|
|2|mno|

Table3
|1|1|
|1|2|
|2|2|

В результате я вижу больше записей, чем необходимо. Я ожидал, что список Table2.name связан с одним Table1.name (указывается параметром @name)

извините за мой английский.

Ответы [ 4 ]

0 голосов
/ 16 мая 2019

Я хочу получить все имена Table2.name, связанные с одним именем Table1.name.

Ваш запрос действительно имеет правильную логику соединения. Вы должны уточнить сферу применения where.

  • Table1.Name содержит @name: вам нужен оператор like вместо оператора равенства.
  • Table1.Name строго равно @name: вы должны удалить символы подстановки.

См. Ниже два примера:

select distinct T2.Name
from Table1 as T1
inner join Table3 as T3 on T3.IDT1 = T1.ID
inner join Table2 as T2 on T2.ID = T3.IDT2
where T1.Name like '%'+@name+'%'

или

select distinct T2.Name
from Table1 as T1
inner join Table3 as T3 on T3.IDT1 = T1.ID
inner join Table2 as T2 on T2.ID = T3.IDT2
where T1.Name = @name
0 голосов
/ 16 мая 2019

Я хочу получить все имена Table2.name, связанные с одним именем Table1.name.

select t2.name
from table2 t2 join
     table3 t3
     on t3.idT2 = t2.id
group by t2.name
having count(*) = 1;

Возвращает имена в t2, которые имеют только одну строку в table3. Это делает два предположения (оба из которых являются обоснованными для этой структуры данных):

  • Имена уникальны в table1 и table2.
  • Пары уникальны в table3.
0 голосов
/ 16 мая 2019
select Table2.Names from Table2 
inner join 
     (select Table3.idT1 as SubQueryID1, Table3.idT2 as SubQueryID2 
      from Table3 inner join Table1 on Table1.id = Table3.idT1) 
on 
Table2.Id = SubQueryID2 
0 голосов
/ 16 мая 2019
SELECT 
    Table2.name 

FROM Table2  
    INNER JOIN Table3 ON Table2.id = Table3.idT2 
    CROSS APPLY(
        SELECT TOP 1 * FROM Table1 WHERE Table1.id = Table3.idT1 
    ) t

WHERE 
    Table1.name = '%'+@name+'%'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...