子句替换临时表中的SQL



我的查询是:

Select * 
from Person 
where KV_CODE IN('','',''......1000 values here)

如何在临时表中写下此值列表,以便我可以在子句中替换为加入以提高性能。

此值列表是根据用户随机选择的,并存储在Java集合中。

Select * from Person P INNER JOIN #Temp T ON T.KV_CODE = P.KV_CODE 

您可以在类似于普通表的温度表上应用INNER JOIN

select *
from Person
where KV_CODE in (
    select KV_CODE
    from TempTable
)

这将将人的kv_code与Tumptable的KV_Code进行比较。如果有匹配项,它将与它们相交,这意味着您的第一个选择将仅打印那些行。

select *
from Person p
join TempTable tmp
on p.KV_CODE = tmp.KV_CODE

这将加入两个表并显示两个表的匹配行。

除非您的问题是"如何从Java集合中填充临时表"

较新的数据库解决方案已经优化了。子句和作为优化器的加入之间没有太大区别,并通过适当的路径执行查询。

如果您仍然希望,这是您要做的。如果您正在使用Oracle,

  1. 您可以创建会话范围或交易范围临时表。
  2. 将数据插入此临时表
  3. 的火灾查询
SELECT * 
FROM PERSONS T1, 
     TEMP_TABLE_NAME_HERE T2 
WHERE T1.KV_CODE = T2.KV_CODE

但是,一个更好的解决方案是避免在运行时间内创建临时表。您实际上可以在应用程序数据库中使用一些唯一键来识别您的会话(即隔离交叉会话影响,即2个使用相同功能的用户)。

)。
CREATE TABLE KV_TEMP_TABLE 
(SESSION_ID VARCHAR2(100), 
KV_CODE VARCHAR2(100)
);

- 适当调整数据类型

那么您的查询应该看起来像

SELECT * FROM PERSONS T1, KV_TEMP_TABLE T2 
WHERE T2.SESSION_ID = ? 
AND T1.KV_CODE = T2.KV_CODE

- 绑定您的会话ID在发布此查询之前,您必须使用普通插入语句(以及会话ID)将数据填充到KV_TEMP_TABLE中。

使用此示例填充临时表:

DECLARE @t TABLE
(
EmployeeID INT,
Certs VARCHAR(8000)
)
INSERT @t VALUES (1,'B.E.,MCA, MCDBA, PGDCA'), (2,'M.Com.,B.Sc.'), (3,'M.Sc.,M.Tech.')
SELECT EmployeeID,
LTRIM(RTRIM(m.n.value('.[1]','varchar(8000)'))) AS Certs
FROM
(
SELECT EmployeeID,CAST('<XMLRoot><RowData>' + REPLACE(Certs,',','</RowData><RowData>') + '</RowData></XMLRoot>' AS XML) AS x
FROM   @t
)t
CROSS APPLY x.nodes('/XMLRoot/RowData')m(n) 

temp表@T填充了,可以与连接一起使用以获取所需的输出。

最新更新