/ / Как да оптимизираме условните под-селекции, които включват вътрешни връзки? - sql-server-2008, свържете се, оптимизиране на заявки, подзадаване, комутативност

Как да оптимизираме условните под-селекции, които включват вътрешни връзки? - sql-server-2008, свържете се, оптимизиране на заявки, подзадаване, комутативност

Имам 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 колоните трябва да имат същия тип данни