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

Posted

技术标签:

【中文标题】SQL - 用“where”子句连接三个表【英文标题】:SQL - join three table with "where" clause 【发布时间】:2019-05-16 09:46:49 【问题描述】:

我想编写一个将在我的 c# 程序中使用的 SP。我有三个表:Table1(id pk,name,...),Table2(id PK,name,...)和 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 参数指定)

对不起,我的英语不好。

【问题讨论】:

操作,我正在使用 SQL Server 分享样本数据 你不是说where Table.name LIKE '%'+@name+'%'吗?另外,您的 where 子句中的 Table 是哪个表? @HoneyBadger 我忘了一个“1”。表是表1 @ZaynulAbadinTuhin 完成 【参考方案1】:
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 

【讨论】:

谢谢。在“(”和“)”之间我添加了 Table1.name = @name SELECT distinct Table2.nome from Table2 inner join(select Table3.idT1 as SubQuery1, Table3.idT2 as SubQuery2 from Table3 inner join Table1 as t1 on t1.id = Table3.idT1 where t1.nome = @nome) as V on V.SubQuery2 = Table2.id【参考方案2】:
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+'%'

【讨论】:

您好,请始终尝试为答案附加更多信息,而不是纯文本。一些 cmets 通常用于描述应该以不同方式执行 OP、如何解决此问题等。【参考方案3】:

我想检索与单个 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 中的对是唯一的。

【讨论】:

【参考方案4】:

我想检索与单个 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

【讨论】:

以上是关于SQL - 用“where”子句连接三个表的主要内容,如果未能解决你的问题,请参考以下文章

为啥对三个表的联合 mysql 查询比在不可能的 where 子句上连接更快?

lambda 表达式使用 select 和 where 子句连接多个表

怎样使数据库中的多表实现联合查询

SQL Server:在包含连接的where子句中使用LEN或变量

Sql的连接表补充

连接表但不显示符合 where 子句的行