SQL - 没有子查询的相同id的每一行中具有相同单元格值的新列

时间:2015-08-04 13:25:06

标签: sql sql-server subquery

抱歉标题不好,我不知道如果你有一个更好的标题会有更好的描述请告诉我;)

请看这些小sql小提琴: http://sqlfiddle.com/#!6/8f522/4/1

我需要新栏目(“年龄”)中特定“标题”的“价值”。但是对于相同的“SN_Main”,我需要任何行中的“值”。 第一个问题是我第一次尝试。这很快就可以,但我只为具有相同“标题”的行获得“值”。

第二个查询是我想要的,但是子查询要慢,所以我想在没有子查询的情况下解决这个问题。高效的表格更大,我需要这样10次,并且子查询变得令人难以置信的慢。

有没有办法用其他sql语句来获取这个输出???

我希望你理解我,我很抱歉不好解释:)

此致 马丁

5 个答案:

答案 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'

SQL FIDDLE

答案 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;

使用子查询,它将为每一行执行,上面的那一行只执行一次,但每行使用结果。

尝试一下,让我知道表现是否合适。