【问题标题】:need to fetch specific data from Left outer join需要从左外连接获取特定数据
【发布时间】:2015-12-15 13:18:29
【问题描述】:

假设我有四张桌子 Main、Parent、child、parentchildmapping 与下面的结构

如果 ConfigTable 的列值为 Parent 或 Child,则 StageId 将为 ParentId 或 ChildId。

现在我必须使用所有其他表在主表上执行左外连接,并需要类似的数据

结果集

  • MT.ID
  • PT.代码
  • CH.代码

例如:-

那么结果应该是这样的

  • 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

【问题讨论】:

  • 不清楚您的问题是什么,您编写的查询有什么问题?你期望结果是什么?你会得到什么?

标签: sql-server


【解决方案1】:

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

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 和你的查询将比子查询更省时(1M 记录),对吧?
  • @RamanSingh,这取决于。除非我对其进行测试,否则我无法判断,但我认为优化器将为两者生成相同的计划。至少带有连接的版本将与带有子查询的版本相同或更有效。但是除非我测试它,否则我不能说这将是 100% 的保证。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-12
  • 2014-12-07
  • 1970-01-01
  • 2010-10-21
  • 1970-01-01
  • 2011-07-02
  • 1970-01-01
相关资源
最近更新 更多