抱歉标题不好,我不知道如果你有一个更好的标题会有更好的描述请告诉我;)
请看这些小sql小提琴: http://sqlfiddle.com/#!6/8f522/4/1
我需要新栏目(“年龄”)中特定“标题”的“价值”。但是对于相同的“SN_Main”,我需要任何行中的“值”。 第一个问题是我第一次尝试。这很快就可以,但我只为具有相同“标题”的行获得“值”。
第二个查询是我想要的,但是子查询要慢,所以我想在没有子查询的情况下解决这个问题。高效的表格更大,我需要这样10次,并且子查询变得令人难以置信的慢。
有没有办法用其他sql语句来获取这个输出???
我希望你理解我,我很抱歉不好解释:)
此致 马丁
答案 0 :(得分:0)
您可以加入同一张桌子
SELECT MAIN.SN_Main
,MAIN.Data
,DETA.SN_Deta
,DETA.Title
,DETA.Value
,DETA2.Value AS Age
FROM MainData AS MAIN
INNER JOIN DetaData AS DETA
ON MAIN.SN_Main = DETA.SN_Main
INNER JOIN DetaData as DETA2
ON DETA.SN_Main = DETA2.SN_Main
and DETA2.Title = 'Age'
答案 1 :(得分:0)
像这样更改第二个查询。使用Left Outer Join
代替correlated sub-query
SELECT MAIN.SN_Main,
MAIN.Data,
DETA.SN_Deta,
DETA.Title,
DETA.Value,
DETA2.Value AS Age
FROM MainData AS MAIN
INNER JOIN DetaData AS DETA
ON MAIN.SN_Main = DETA.SN_Main
LEFT JOIN DetaData AS DETA2
ON DETA.SN_Main = DETA2.SN_Main
AND DETA2.Title = 'Age'
答案 2 :(得分:0)
这个怎么样?:
SELECT m.[SN_Main]
, m.[Data]
, d.[SN_Deta]
, d.[Title]
, d.[Value]
, da.[Value]
FROM MainData m
INNER JOIN DetaData d
ON d.[SN_Main] = m.[SN_Main]
INNER JOIN DetaData da
ON da.[SN_Main] = m.[SN_Main]
AND da.[Title] = 'Age'
答案 3 :(得分:0)
适当的索引也可以起作用:
CREATE NONCLUSTERED INDEX idx_DetaData_SN_Main_Title ON DetaData
( SN_Main, Title) INCLUDE (Value)
使用内部联接重写您的查询:
SELECT MAIN.SN_Main, MAIN.Data, DETA.SN_Deta, DETA.Title, DETA.Value, DETA2.Value
FROM MainData AS MAIN
INNER JOIN DetaData AS DETA ON MAIN.SN_Main = DETA.SN_Main
INNER JOIN DetaData AS DETA2 ON MAIN.SN_Main = DETA2.SN_Main AND DETA2.Title = 'Age'
答案 4 :(得分:0)
我会说,不是不使用子查询,而是以不同的方式使用它:
select main.*,
age_lookup.age
from detadata as main,
(select sn_main,
deta2.value as age
from DetaData as deta2
where title = 'Age') age_lookup
where main.sn_main = age_lookup.sn_main;
使用子查询,它将为每一行执行,上面的那一行只执行一次,但每行使用结果。
尝试一下,让我知道表现是否合适。