Sql server 需要从左外部联接获取特定数据

Sql server 需要从左外部联接获取特定数据,sql-server,Sql Server,假设我有四张桌子 Main、Parent、child、parentchildmapping具有以下结构 如果ConfigTable将列值设置为Parent或Child,则StageId将为ParentId或ChildId 现在,我必须使用所有其他表在主表上执行左外部联接,并且需要如下数据 结果集 西德峰 零件代码 中国代码 例如:- 那么结果应该是这样的 1 PT01空 2 PT01 CH01 到目前为止,我的问题是 select MT.ID, PT.code, CH.code fr

假设我有四张桌子 Main、Parent、child、parentchildmapping具有以下结构

如果ConfigTable将列值设置为Parent或Child,则StageId将为ParentId或ChildId

现在,我必须使用所有其他表在主表上执行左外部联接,并且需要如下数据

结果集

  • 西德峰
  • 零件代码
  • 中国代码
例如:-

那么结果应该是这样的

  • 1 PT01空
  • 2 PT01 CH01
到目前为止,我的问题是

select MT.ID, PT.code, CH.code from Maintable MT
left outer join Parent PT on MT.SatgeId = PT.ID and MT.ConfigTable = 'Parent'
left outer join child CH on MT.SatgeId = CH.ID and MT.ConfigTable = 'Child'
对,我得到的输出像

  • 1 PT01空
  • 2空CH01

您需要使用映射表来按子级选择父级。以下是如何做到这一点:

DECLARE @mt TABLE(ID INT, StageID INT, ConfigTable VARCHAR(10))
DECLARE @pt TABLE(ID INT, Code VARCHAR(10))
DECLARE @ct TABLE(ID INT, Code VARCHAR(10))
DECLARE @map TABLE(ID INT, ParentID INT, ChildID INT)

INSERT INTO @mt VALUES(1, 1, 'Parent'),(2, 1, 'Child')
INSERT INTO @pt VALUES(1, 'PT01')
INSERT INTO @ct VALUES(1, 'CH01')
INSERT INTO @map VALUES(1, 1, 1)

SELECT mt.ID, 
       ISNULL(pt.Code, ptp.Code) AS PCode, 
       ct.Code AS CCode
FROM @mt mt
LEFT JOIN @pt pt ON mt.ConfigTable = 'Parent' AND mt.StageID = pt.ID
LEFT JOIN @ct ct ON mt.ConfigTable = 'Child' AND mt.StageID = ct.ID
LEFT JOIN @map map ON ct.ID = map.ChildID
LEFT JOIN @pt ptp ON map.ParentID = ptp.ID
输出:

ID  PCode   CCode
1   PT01    NULL
2   PT01    CH01

你的问题是什么还不清楚,你写的查询有什么不起作用?你期望得到什么结果,得到什么结果?嗨,有没有其他方法,比如不再次连接同一个表来达到这个结果????RamanSingh,你可以使用子查询,但这是标准且简单的解决方案。k thnx和ur查询将比子查询更具时间效率(1M记录),对吗?@RamanSingh,视情况而定。除非我对它进行测试,否则我无法判断,但我认为优化器将为两者生成相同的计划。至少使用join的版本与使用子查询的版本相同或更高效。但我不能说这将是100%的保证,除非我测试它。