SQL-使用“ where”子句连接三个表

时间:2019-05-16 09:46:50

标签: c# sql sql-server

我想编写一个将在我的c#程序中使用的SP。我有三个表:Table1(id pk,名称,...),Table2(id PK,名称,...)和Table3((idT1,idT2)PK FK)。因此,Table3为Table1和Table2之间的n:n关系建模。

我想检索与单个Table1.name相关的所有Table2.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|

结果,我看到了比所需更多的记录。我希望有一个与单个Table1.name有关的Table2.name列表(由@name参数指定)

对不起,我的英语。

4 个答案:

答案 0 :(得分:0)

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+'%'

答案 1 :(得分:0)

  

我想检索与单个Table1.name相关的所有Table2.name。

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

这将返回t2中仅在table3中只有一行的名称。这有两个假设(对于这个数据结构而言,两个假设都是合理的):

  • 名称在table1table2中是唯一的。
  • 对在table3中是唯一的。

答案 2 :(得分:0)

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 

答案 3 :(得分:0)

  

我想检索与单个Table1.name相关的所有Table2.name。

您的查询实际上具有正确的联接逻辑。您必须弄清楚where子句的范围。

  • Table1.Name 包含 @name:您需要使用like运算符而不是equal运算符。
  • 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