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'
我会说与其不使用子查询,不如以不同的方式使用它:
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;
对于您的子查询,它将针对每一行执行,对于上面的子查询,它将只执行一次,但对每一行都使用结果。
试一试,让我知道性能是否正常。
抱歉,标题不好,我不知道如何描述更好,如果你有更好的请告诉我;)
请看这些小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'
我会说与其不使用子查询,不如以不同的方式使用它:
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;
对于您的子查询,它将针对每一行执行,对于上面的子查询,它将只执行一次,但对每一行都使用结果。
试一试,让我知道性能是否正常。