Имам SQL заявка (MS SQL 2008), която бих искал да оптимизирам скоростта. Той има следната структура (само в действителност има 10 различни случая в случая).
Важните битове са подлекторите в израза на случая, които включват вътрешни връзки между допълнителни таблици и позоваване на една от таблиците в клаузата FROM (таблица1).
Мислех, че мога да оптимизирам товалявата (външната) се свързва в клаузата FROM, вместо под подбора, но не съм сигурен, защото под подборът включва и вътрешни връзки. След това ще използвам две леви връзки в клаузата FROM, където сега използвам вътрешна връзка в под подбора? И как би могло да се работи с друга таблица3 от втория случай?
Всички идеи са много ценени.
SELECT table1.a,
table2.b,
CASE
WHEN table1.XY = 1 THEN
(SELECT something
FROM AnotherTable1 at1
INNER JOIN AnotherTable2 at2
ON at1.x = at2.y
WHERE at1.abc = table2.abc)
WHEN table1.XY = 2 THEN
(SELECT something
FROM AnotherTable1 at1
INNER JOIN AnotherTable3 at3
ON at1.x = at3.y
WHERE at1.abc = table2.abc)
END AS [problem]
FROM MyTable1 table1
INNER JOIN MyTable2 table2
ON table1.a = table2.b
Отговори:
0 за отговор № 1В този специален случай, при който AnotherTable1 е свързан както при части със същите условия, имаш нужда само от три леви връзки:
SELECT table1.a,
table2.b,
CASE
WHEN table1.XY = 1 THEN
?.something -- from whereever it"s coming
WHEN table1.XY = 2 THEN
?.something -- from whereever it"s coming
END AS [problem]
FROM MyTable1 table1
INNER JOIN MyTable2 table2
ON table1.a = table2.b
LEFT JOIN AnotherTable1 at1
ON at1.abc = table2.abc
LEFT JOIN AnotherTable2 at2
ON at1.x = at2.y
LEFT JOIN AnotherTable3 at3
ON at1.x = at3.y
В по-общ случай бихте имали тази опция
FROM MyTable1 table1
INNER JOIN MyTable2 table2
ON table1.a = table2.b
LEFT JOIN
(select *
from AnotherTable1 at1
INNER JOIN
AnotherTable2 at2
ON at1.x = at2.y
) at1
ON at1.abc = table2.abc
...
0 за отговор № 2
Можете да опитате следното:
SELECT
table1.a,
table2.b,
CASE
WHEN table1.XY = 1 THEN at2.something
WHEN table1.XY = 2 THEN at3.something
END
FROM MyTable1 table1
INNER JOIN MyTable2 table2
ON table1.a = table2.b
LEFT JOIN AnotherTable1 at1
ON at1.abc = table2.abc
INNER JOIN AnotherTable2 at2
ON at1.x = at2.y
INNER JOIN AnotherTable3 at3
ON at1.x = at3.y
Но проверете резултатите, също така имайте предвид, че at2 и at3 колоните трябва да имат същия тип данни