我的查询是:
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,
- 您可以创建会话范围或交易范围临时表。
- 将数据插入此临时表 的火灾查询
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填充了,可以与连接一起使用以获取所需的输出。