内部连接的优化查询 [英] Optimized Query for inner Join

查看:71
本文介绍了内部连接的优化查询的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

Hello EveryOne



我有两张桌子A和桌子B



表A包含

 AID |描述
1 | ABC
2 | DEF
3 | GHI
4 | JKL





TableB包含

 BID | AIDRefrence 
1 | 1
2 | 1
3 | 2
4 | 2
5 | 6
6 | 2





我的输出表必须像这样

TableC

 AID | BID |描述
1 | 1 | ABC(BID(1,2)可以是AIDRefrence 1中的任何一个)
2 | 3 | DEF(BID(3,4,6)可以是AIDRefrence中的任何一个2)



我的代码就像是

 选择 a.AID,b.BID,a.description 
(< span class =code-keyword>选择 * 来自 B 其中 BID 选择 max(BID)来自 TableB group AIDRefrence))B 内部 加入表A A
a。 aid = b.AIDRefrence





只有我面临的问题是TableB包含超过50K行,而在GroupBy上它返回至少15K行。

可以有人优化这个查询。

解决方案

我不确定你想要实现什么,但请看下面的例子:

  DECLARE   @ tab1   TABLE (AID  INT   IDENTITY  1  1 ) ,aDescription  VARCHAR  30 ))

INSERT INTO @ tab1 (aDescription)
SELECT ' ABC'
UNION ALL SELECT ' DEF'
UNION ALL SELECT ' GHI'
UNION ALL SELECT ' JKL'


DECLARE @ tab2 TABLE (BID < span class =code-keyword> INT IDENTITY 1 1 ),AIDReference INT

INSERT INTO @ tab2 (AIDReference)
SELECT 1
UNION ALL SELECT 1
UNION < span class =code-keyword> ALL
SELECT 2
UNION ALL SELECT 2
UNION 所有 SELECT 6
UNION ALL SELECT 2

SELECT a.AID,b.BID,a.aDescription
FROM @ tab1 AS a INNER JOIN @ tab2 AS b ON a.AID = b .AIDReference





结果:

 1 1 ABC 
1 2 ABC
2 3 DEF
2 4 DEF
2 6 DEF





更多信息,请参阅: SQL连接的可视化表示 [ ^ ]





如果你想列举一行中每个AID的所有BID,请看:



  SELECT  a.AID,a.aDescription,STUFF(( SELECT  ' ,' +  CONVERT  VARCHAR  30 ),b.BID) AS  '  text()' 
FROM < span class =code-sdkkeyword> @ tab2 AS b
WHERE a.AID = b.AIDReference
FOR XML PATH(' ')), 1 1 ' ' AS [BIDs]
FROM @ tab1 AS a
GROUP BY a.AID,a.aDescription





结果:

 AID Desc .. BID 
1 ABC 1 2
2 DEF 3 4 6
3 GHI NULL
4 JKL NULL







[/ EDIT]


由于TableB仅包含BID和AIDRefrence,因此您的内部查询不必要地复杂。

替换

从 *  > TableB 其中 BID  选择最大值(BID)来自 TableB  group   AIDRefrence ))



by

 select  AIDRefrence  as  AID,max(BID) as  BID 来自 TableB  group   AIDRefrence)A 



顺便提一下,您向我们展示的代码中必定存在一些错误:选择... a.description - a不包含列description,它位于TableA中。


全部谢谢,但我自己解决了这个问题。

 声明  @ tbl  (BID  int 

插入 进入 @ tbl
从<选择最大值(b.BID) / span> TableA a inner join TableB b on a.aid = b.AIDrefrence
group b.AIDRefrence

选择 a.AID,b.BID,a.description
来自 tableB B 内部 加入表A A
a.aid = b.AIDRefrence
其中 b.bid @ tbl 中选择
*


Hello EveryOne

I have Two Table TableA and TableB

Table A contains

AID | Description
1    |  ABC
2    |  DEF
3    |  GHI
4    |  JKL



TableB Contains

BID| AIDRefrence
1    |  1
2    |  1
3    |  2
4    |  2
5    |  6
6    |  2



My Output Table must be like This
TableC

AID | BID | Description
1 | 1| ABC (BID(1,2) Can be Any one of AIDRefrence 1)
2 | 3| DEF (BID(3,4,6) Can be Any one of AIDRefrence 2)


My Code is Like

Select a.AID, b.BID, a.description
    From (Select * from Table B where BID in (select max(BID) from TableB group By AIDRefrence )) B inner Join TableA A
    on a.aid = b.AIDRefrence



Only Problem That I face is thet TableB contains More then 50K rows and on GroupBy it returns atleast 15K rows.
Can Some one Optimize this Query.

解决方案

I'm not sure what you want to achieve, but see below example:

DECLARE @tab1 TABLE (AID INT IDENTITY(1,1), aDescription VARCHAR(30))

INSERT INTO @tab1 (aDescription)
SELECT 'ABC'
UNION ALL SELECT 'DEF'
UNION ALL SELECT 'GHI'
UNION ALL SELECT 'JKL'


DECLARE @tab2 TABLE (BID INT IDENTITY(1,1), AIDReference INT)

INSERT INTO @tab2 (AIDReference)
SELECT 1
UNION ALL SELECT 1
UNION ALL SELECT 2
UNION ALL SELECT 2
UNION ALL SELECT 6
UNION ALL SELECT 2

SELECT a.AID, b.BID, a.aDescription
FROM @tab1 AS a INNER JOIN @tab2 AS b ON a.AID = b.AIDReference



Result:

1   1   ABC
1   2   ABC
2   3   DEF
2   4   DEF
2   6   DEF



For furhter information, please, see: Visual Representation of SQL Joins[^]

[EDIT]
If you want to enumerate all BIDs for each AID in one row, please, see this:

SELECT a.AID, a.aDescription, STUFF( (SELECT',' + CONVERT(VARCHAR(30), b.BID) AS 'text()'
                  FROM @tab2 AS b
                  WHERE a.AID = b.AIDReference
                  FOR XML PATH('')), 1, 1, '') AS [BIDs]
FROM @tab1 AS a
GROUP BY a.AID, a.aDescription



Result:

AID Desc.. BIDs
1   ABC    1,2
2   DEF    3,4,6
3   GHI    NULL
4   JKL    NULL




[/EDIT]


Since TableB contains only BID and AIDRefrence, your inner query is unnecessarily complicated.
Replace

(Select * from TableB where BID in (select max(BID) from TableB group By AIDRefrence )) A 


by

(select AIDRefrence as AID, max(BID) as BID from TableB group By AIDRefrence ) A


By the way, there must be some error in the code you show us: Select ... a.description - a does not contain a column "description", it is in TableA.


Thanks All But I have Solved this Query myself.

Declare @tbl Table(BID int)

Insert Into @tbl
Select Max(b.BID) from TableA a inner join TableB b on a.aid = b.AIDrefrence
group By b.AIDRefrence

Select a.AID, b.BID, a.description
From tableB B inner Join TableA A
    on a.aid = b.AIDRefrence
where b.bid in (Select * from @tbl)


这篇关于内部连接的优化查询的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆