如何来写这个一对多查询语句?

lingyun410 2010-10-08 01:56:33


Create Table [CNode_Test](
ID BigInt IDENTITY(1,1) Not Null,
T_LbID Int,
T_LgID Int
)
Alter Table [CNode_Test] Add Constraint PK_cnodeTest_ID Primary Key Clustered(ID)
Alter Table [CNode_Test] Add Constraint DF_cnodeTest_LbId Default 0 For T_LbID
Alter Table [CNode_Test] Add Constraint DF_cnodeTest_LgId Default 0 For T_LgID

Insert Into [CNode_Test]
(T_LbID,T_LgID)
Select 1,2 Union All
Select 1,9 Union All
Select 1,1 Union All
Select 2,1 Union All
Select 2,11 Union All
Select 3,9 Union All
Select 3,11 Union All
Select 3,1 Union All
Select 3,6 Union All
Select 4,9 Union All
Select 4,11

Create Table [CNode_TestLb](
ID Int IDENTITY(1,1) Not Null,
TL_Name nVarChar(20)
)
Alter Table [CNode_TestLb] Add Constraint PK_cnodeTestLb_ID Primary Key Clustered(ID)
Alter Table [CNode_TestLb] Add constraint DF_cnodeTestLb_Name Default '' For TL_Name
Insert Into [CNode_TestLb]
(TL_Name)
Select 'LB1' Union All
Select 'LB2' Union All
Select 'LB3' Union All
Select 'LB4'
Create Table [CNode_TestLg](
ID Int IDENTITY(1,1) Not Null,
TG_Name nVarChar(20)
)
Alter Table [CNode_TestLg] Add Constraint PK_cnodeTestLg_ID Primary Key Clustered(ID)
Alter Table [CNode_TestLg] Add Constraint DF_cnodeTestLg_Name Default '' For TG_Name
Insert Into [CNode_TestLg]
(TG_Name)
Select 'LG1' Union All
Select 'LG2' Union All
Select 'LG3' Union All
Select 'LG4' Union All
Select 'LG5' Union All
Select 'LG6' Union All
Select 'LG7' Union All
Select 'LG8' Union All
Select 'LG9' Union All
Select 'LG10' Union All
Select 'LG11'



--------------------------------------
[CNode_TestLb]与[CNode_TestLg]表是通过[CNode_Test]表相关联的,一对多的关联表。比如LB1对应着多个LG记录
--------------------------------------
如:
LB1 |----- LG1
|----- LG2
|----- LG9

如何查询即与LG9有关系且与LG1或LG11有关系的记录
...全文
1984 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
lingyun410 2010-10-08
  • 打赏
  • 举报
回复
恩,语句挺复杂的。不过为我提供了一些参考。谢谢!~
SQLCenter 2010-10-08
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 lingyun410 的回复:]

想要的查询结果:
--------------
ID TL_Name
1 LB1
3 LB3
4 LB4
--------------
因为LB2没有关联到LG9这个点
[/Quote]

-- having
select a.ID,max(a.TL_Name)TL_Name from CNode_TestLb a join CNode_Test b on a.ID=b.T_LbID group by a.ID
having sum(case T_LgID when 9 then 9 when 1 then 1 when 11 then 2 else 0 end) >= 10

-- exists
select * from CNode_TestLb t where
exists (select 1 from CNode_Test where T_LbID=t.ID and T_LgID=9)
and exists (select 1 from CNode_Test where T_LbID=t.ID and (T_LgID=1 or T_LgID=11))

「已注销」 2010-10-08
  • 打赏
  • 举报
回复
需要TG_NAME的话就参考8#
SELECT T_LbID  ID,TL_NAME
FROM (
SELECT c.T_LbID,N.TL_NAME,G.TG_NAME,ROW_NUMBER()OVER(PARTITION BY TL_NAME ORDER BY GETDATE())ROW
FROM (
select * from CNode_Test t where
exists (select 1 from CNode_Test where T_LbID=t.T_LbID and T_LgID=9)
and exists (select 1 from CNode_Test where T_LbID=t.T_LbID and (T_LgID=1 or T_LgID=11))
)C
LEFT JOIN [CNODE_TESTLB] N ON C.T_LBID=N.ID
LEFT JOIN [CNODE_TESTLG] G ON C.T_LGID=G.ID
and exists (select 1 from CNode_Test where T_LbID=c.T_LbID and (T_LgID=1 or T_LgID=11))
)M
WHERE ROW=1

ID TL_NAME
----------- --------------------
1 LB1
3 LB3
4 LB4

(3 row(s) affected)
lingyun410 2010-10-08
  • 打赏
  • 举报
回复
想要的查询结果:
--------------
ID TL_Name
1 LB1
3 LB3
4 LB4
--------------
因为LB2没有关联到LG9这个点
lingyun410 2010-10-08
  • 打赏
  • 举报
回复
@zsh0809
这个结果不对,不应该包括LB2

[CNode_TestLb]这个表中的记录必须与LG9这个记录关联且关联到LG1或LG11
「已注销」 2010-10-08
  • 打赏
  • 举报
回复
整理一下:
SELECT CASE WHEN ROW=1 THEN TL_NAME ELSE '' END TL_NAME,TG_NAME
FROM (
SELECT N.TL_NAME,G.TG_NAME,ROW_NUMBER()OVER(PARTITION BY TL_NAME ORDER BY GETDATE())ROW
FROM (
select * from CNode_Test t where
exists (select 1 from CNode_Test where T_LbID=t.T_LbID and T_LgID=9)
and exists (select 1 from CNode_Test where T_LbID=t.T_LbID and (T_LgID=1 or T_LgID=11))
)C
LEFT JOIN [CNODE_TESTLB] N ON C.T_LBID=N.ID
LEFT JOIN [CNODE_TESTLG] G ON C.T_LGID=G.ID
and exists (select 1 from CNode_Test where T_LbID=c.T_LbID and (T_LgID=1 or T_LgID=11))
)M

TL_NAME TG_NAME
-------------------- --------------------
LB1 LG2
LG9
LG1
LB3 LG9
LG11
LG1
LG6
LB4 LG9
LG11

(9 row(s) affected)

「已注销」 2010-10-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lingyun410 的回复:]

3楼的写法,我看不懂,可以给解释一下么?
[/Quote]
你想要的是什么结果?
你写出你期望的结果,我不清楚3#这个是不是你期望的
lingyun410 2010-10-08
  • 打赏
  • 举报
回复
3楼的写法,我看不懂,可以给解释一下么?
lingyun410 2010-10-08
  • 打赏
  • 举报
回复
其实我的这个查询左侧还有一个使用LB数据的表,是一对多,多再对多的关系,需要从右侧一级级的筛选符合要求的记录。
lingyun410 2010-10-08
  • 打赏
  • 举报
回复
有没有更高效点的写法?
「已注销」 2010-10-08
  • 打赏
  • 举报
回复
SELECT CASE WHEN ROW=1 THEN TL_NAME ELSE '' END TL_NAME,TG_NAME
FROM (
SELECT N.TL_NAME,G.TG_NAME,ROW_NUMBER()OVER(PARTITION BY TL_NAME ORDER BY GETDATE())ROW
FROM [CNODE_TEST] C
LEFT JOIN [CNODE_TESTLB] N ON C.T_LBID=N.ID
LEFT JOIN [CNODE_TESTLG] G ON C.T_LGID=G.ID
)M

TL_NAME TG_NAME
-------------------- --------------------
LB1 LG2
LG9
LG1
LB2 LG1
LG11
LB3 LG9
LG11
LG1
LG6
LB4 LG9
LG11

(11 row(s) affected)
kevn 2010-10-08
  • 打赏
  • 举报
回复
顶1楼
SQLCenter 2010-10-08
  • 打赏
  • 举报
回复
select * from CNode_Test t where
exists (select 1 from CNode_Test where T_LbID=t.T_LbID and T_LgID=9)
and exists (select 1 from CNode_Test where T_LbID=t.T_LbID and (T_LgID=1 or T_LgID=11))

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧