我想编写一个将在我的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参数指定)
对不起,我的英语。
答案 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
中只有一行的名称。这有两个假设(对于这个数据结构而言,两个假设都是合理的):
table1
和table2
中是唯一的。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