T-SQL: проверить, существуют ли данные в таблице

#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