我正在使用一个视图,该视图检查另一个表中是否存在数据,以及是否显示连接到该表的行数。现在,我想知道是否可能有一种更快的方法,因为我只对是否有数据感兴趣,而不必关心有多少数据行。我猜想它不需要计数时会更快。
这就是我现在使用的:
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的产品数量。但是,我只想知道用户在商店后面是否有产品,我不需要知道有多少种。在我看来,这是一个更快的解决方案(无论如何都要走到商店的后面)。因此,将COUNT替换为...吗?
答案 0 :(得分:2)
您是对的,为了查询数据是否存在于另一个表中,我们使用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'
答案 1 :(得分:0)
如果您将左联接更改为内部联接,则只会得到具有产品的用户列表。其他用户将不会出现在列表中。
SELECT
dbo.user.id,
dbo.user.userCode
FROM dbo.user
JOIN dbo.Product
ON dbo.Product.userCode= TotalProducts.userCode