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

SQL - new column with the same cell value in every row for the same id without subquery

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

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

我需要新列 ("Age") 中特定 "Title" 的 "Value"。但是对于相同的 "SN_Main",我需要任何行中的 "Value"。 第一个查询是我的第一次尝试。它又快又好,但我只得到具有相同 "Title".

的行的 "Value"

第二个查询是我想要的但是子查询很慢,所以我想不用子查询来解决这个问题。生产表更大,我需要它 10 次,使用子查询它变得非常慢。

那么有什么方法可以通过其他 sql 语句获得此输出???

我希望你理解我,对于错误的解释我很抱歉:)

问候 马丁

您可以重新加入同一 table

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'

像这样更改第二个查询。使用 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' 

这个怎么样?:

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'

适当的索引也可以工作:

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

我会说与其不使用子查询,不如以不同的方式使用它:

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;

对于您的子查询,它将针对每一行执行,对于上面的子查询,它将只执行一次,但对每一行都使用结果。

试一试,让我知道性能是否正常。