Самый быстрый способ присоединить временную таблицу к нескольким столбцам в T-SQL - PullRequest
0 голосов
/ 20 марта 2011

Мне нужно написать запрос SQL, чтобы отфильтровать таблицу по 4 потенциальным столбцам из другой таблицы значений фильтра.

Пример того, что я пытаюсь сделать:

-- This table could have anywhere from 1 to 2000 possible rows
DECLARE @WidgetOwners TABLE (OwnerID INT PRIMARY KEY)
INSERT INTO @WidgetOwners VALUES (5)
INSERT INTO @WidgetOwners VALUES (50)
INSERT INTO @WidgetOwners VALUES (111)
INSERT INTO @WidgetOwners VALUES (12345)
INSERT INTO @WidgetOwners VALUES (6)
--etc...

SELECT w.WidgetID
FROM Widgets w
WHERE w.SellerManagerID IN (SELECT o.OwnerID FROM @WidgetOwners)
OR w.SellerID IN (SELECT o.OwnerID FROM @WidgetOwners)
OR w.BuyerManagerID IN (SELECT o.OwnerID FROM @WidgetOwners)
OR w.BuyerID IN (SELECT o.OwnerID FROM @WidgetOwners)

У меня сложилось впечатление, что SUB SELECTS в приведенном выше запросе будет работать не очень хорошо. Есть лучший способ сделать это? Может ли это быть сделано ЛЕВОМ ПОДКЛЮЧЕНИЕМ к таблице @WidgetOwner несколько раз? У кого-нибудь есть какие-либо рекомендации здесь?

Имейте в виду, что я застрял в SQL 2000 прямо сейчас и не могу обновить в данный момент.

РЕДАКТИРОВАТЬ - Пример 2 (это что-то еще, что я пытаюсь)

SELECT w2.WidgetID, w2.* -- etc
FROM (
    SELECT w.WidgetID
    FROM Widgets w
    INNER JOIN @WidgetOwners o ON w.SellerManagerID = o.OwnerID
    UNION
    SELECT w.WidgetID
    FROM Widgets w
    INNER JOIN @WidgetOwners o ON w.SellerID = o.OwnerID
    UNION
    SELECT w.WidgetID
    FROM Widgets w
    INNER JOIN @WidgetOwners o ON w.BuyerManagerID = o.OwnerID
    UNION
    SELECT w.WidgetID
    FROM Widgets w
    INNER JOIN @WidgetOwners o ON w.BuyerID = o.OwnerID
) x
INNER JOIN Widgets w2 ON x.WidgetID = w2.WidgetID

Ответы [ 2 ]

3 голосов
/ 20 марта 2011

Существует много практических правил для построения эффективных запросов.Но я хотел бы предположить, что когда речь идет о производительности, всегда лучше экспериментировать с различными подходами и видеть на практике, что работает лучше всего.Особенно, когда количество строк велико.

0 голосов
/ 20 марта 2011

Предлагаем попробовать внешние соединения:

SELECT o1.ownerid, o2.ownerid, o3.ownerid, o4.ownserid
    ... 
FROM widgets w
LEFT JOIN o AS o1 ON w.SellerManagerID = o.OwnerID
LEFT JOIN o AS o2 ON w.SellerID = o.OwnerID
LEFT JOIN o AS o3 ON  w.BuyerManagerID = o.OwnerID
LEFT JOIN o AS o4 ON w.BuyerID = o.OwnerID

Если полезно, (не зная вашего требования), вы можете использовать

COALESCE(o1.OwnerID, o2.OwnerID, o3.ownerID, o4.ownerID)

или

CASE WHEN o1.ownerID IS NULL THEN ...

По моему опыту, внешние объединения почти всегда так же эффективны, как и любой другой вариант, особенно по сравнению с коррелированными подзапросами.

Я также беспокоюсь, когда вы упоминаете «временную таблицу».

...