Как переписать устаревший синтаксис соединения *= в SQL Server

Я пытаюсь переписать устаревший синтаксис соединения с новыми стандартами.

SELECT count(*)
FROM es_dbo.tablTypes t
    ,es_dbo.tablReg r
    ,es_dbo.tabl_PRGandCLI p
WHERE t.ClientType *= r.ClientType
    AND p.ID IN (
        SELECT DISTINCT ClientID
        FROM esinet_dbo.tablReG
        )
    AND t.ClientType IN (@intClientType)

Вот что я пытаюсь.

SELECT count(*)
FROM es_dbo.tablTypes t
LEFT JOIN es_dbo.tablReg r ON t.ClientType = r.ClientType
LEFT JOIN es_dbo.tabl_PRGandCLI p ON p.ID IN (
        SELECT DISTINCT ClientID
        FROM es_dbo.tablReG
        )

Я получаю одинаковое количество записей независимо от того, использую ли я LEFT JOIN или INNER JOIN во 2-й части запроса. Кто-нибудь может объяснить


person Shantanu Gupta    schedule 18.12.2015    source источник
comment
Вы получаете одни и те же записи, потому что имеющиеся данные означают, что нет никакой разницы. Я думаю, что ваша переписывание должно быть внутренним соединением, а не левым, и я не думаю, что вам нужен внутренний подзапрос   -  person Allan S. Hansen    schedule 18.12.2015
comment
Я не уверен, следует ли использовать es_dbo.tabl_PRGandCLI во INNER JOIN или LEFT JOIN. Нет условий для подключения   -  person Shantanu Gupta    schedule 18.12.2015
comment
Если нет условия присоединения, то я думаю, что это крест   -  person Allan S. Hansen    schedule 18.12.2015
comment
Я думаю, что запрос, который вы пробовали, правильно воспроизводит логику. Можете ли вы найти пример строки данных, которая была возвращена старым запросом, но не возвращена вашим новым запросом?   -  person Tab Alleman    schedule 18.12.2015


Ответы (2)


Попробуйте следующее:

SELECT count(*)
FROM es_dbo.tablTypes t
    left join es_dbo.tablReg r on t.ClientType = r.ClientType
WHERE t.ClientType IN (@intClientType)
   EXISTS (SELECT 1 FROM esinet_dbo.tablReG p WHERE r.ClientID = p.ID)

1) Я предположил, что @intClientType является скалярным значением, поэтому нет необходимости в IN

2) удалил DISTINCT и подзапрос, поскольку вы проверяете его существование. EXISTS должен быть быстрее, поскольку он включает в себя поиск первого элемента, а не сортировку для DISTINCT.

3) *= был заменен на LEFT JOIN на основе обсуждения из здесь.

person Alexei - check Codidact    schedule 18.12.2015
comment
Исходный запрос выбирает несколько столбцов. Я просто заменил на COUNT(*), чтобы увидеть результат. без значения параметра запрос возвращал более 100 миллионов записей. - person Shantanu Gupta; 18.12.2015
comment
Хорошо, я обновил предлагаемую замену запроса соответственно - person Alexei - check Codidact; 18.12.2015

Это ни внутреннее соединение, ни левое соединение в соответствии с запросом, это похоже на перекрестное соединение, поэтому вы можете использовать следующий запрос:

SELECT count(*)
FROM es_dbo.tablTypes t
LEFT JOIN es_dbo.tablReg r ON t.ClientType = r.ClientType,
es_dbo.tabl_PRGandCLI p WHERE p.ID IN (
    SELECT DISTINCT ClientID
    FROM es_dbo.tablReG
    )
person Sundar Singh    schedule 18.12.2015