#sql #tsql
#sql #tsql
Вопрос:
Я использую представление, которое проверяет, существуют ли данные в другой таблице, и если они существуют, если показывает количество строк, подключенных к этой таблице. Теперь мне было интересно, может ли быть более быстрый способ сделать это, поскольку меня интересует только наличие данных и не обязательно, сколько там строк данных. Я думаю, когда их не нужно считать, это будет быстрее.
Это то, что я использую сейчас:
SELECT
dbo.user.id,
dbo.user.userCode,
COALESCE (TotalProducts.ProductsInback, 0) AS ProductsInback
FROM
dbo.user
LEFT OUTER JOIN
(SELECT COUNT(id_product) AS ProductsInback, userCode
FROM dbo.Product
GROUP BY userCode) AS TotalProducts ON dbo.Product.userCode = TotalProducts.userCode
WHERE
dbo.user.userCode = 'XYZ'
Теперь все работает нормально, и это дает мне количество продуктов, подключенных к пользователю XYZ, которые находятся в задней части магазина. Однако я просто хочу знать, есть ли у пользователя товары в задней части магазина, мне не нужно знать, сколько. Мне кажется, это более быстрое решение (в любом случае, переход к задней части хранилища). Итак, заменив СЧЕТЧИК на … ?
Ответ №1:
Вы правы, для поиска, существуют ли данные в другой таблице, мы используем EXISTS
или IN
, потому что тогда нам не нужно перебирать все совпадающие строки, но мы можем остановиться на первой найденной.
EXISTS
:
SELECT
id,
userCode,
CASE WHEN EXISTS (SELECT * FROM dbo.Product p WHERE p.userCode = u.userCode )
THEN 1 ELSE 0 END AS ProductsInback
FROM dbo.user u
WHERE u.userCode = 'XYZ'
IN
:
SELECT
id,
userCode,
CASE WHEN userCode IN (SELECT userCode FROM dbo.Product)
THEN 1 ELSE 0 END AS ProductsInback
FROM dbo.user
WHERE userCode = 'XYZ'
Ответ №2:
Если вы измените левое соединение на внутреннее соединение, вы просто получите список пользователей с продуктами. Другие пользователи не будут отображаться в списке.
SELECT
dbo.user.id,
dbo.user.userCode
FROM dbo.user
JOIN dbo.Product
ON dbo.Product.userCode= TotalProducts.userCode