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 = @nameSELECT 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
中只有一行的名称。这做了两个假设(对于这个数据结构来说,这两个都是合理的):
table1
和 table2
中是唯一的。
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 子句连接多个表