查询以获取记录ID(如果存在于任何表中)

时间:2019-07-17 21:20:47

标签: sql sql-server tsql

我有这四个表,它们用于存储用户项。

该项是唯一的,一次只能存在一个表。

此外,我正在使用串行列进行搜索

users:
======
id
name

user_bags:
==========
id
user_id
serial


user_store:
===========
id
user_id
serial

user_storage:
============
id
user_id
serial

我有一个项目列表,需要搜索它们是否在任何表中,并在该表中显示记录的ID。


user_name |   user_bags   |    user_store   |    user_storage    |      
==================================================================
A         |     2390      |                 |                    |
------------------------------------------------------------------
B         |               |        352      |                    |
------------------------------------------------------------------
A         |     5500      |                 |                    |
------------------------------------------------------------------
C         |               |                 |         6440       |
------------------------------------------------------------------

我尝试过:

SELECT
     users.name AS user_name,
     (SELECT id FROM user_bags WHERE user_bags.serial = 'abc' AND user_bags.user_id = users.id) AS user_bags,
     (SELECT id FROM user_storage WHERE user_storage.serial = 'abc' AND user_storage.user_id = users.id) AS user_storage,
     (SELECT id FROM user_store WHERE user_store.serial = 'abc' AND user_store.user_id = users.id) AS user_store
FROM
     users

如何更好地查询(更快)?和一个合适的。我将浏览几千个序列,同时每个表中都有一百万条记录。

已更新:仅与找到匹配项的用户一起显示

2 个答案:

答案 0 :(得分:0)

您的查询很好。为了提高性能,您希望在子查询中使用的三个表中的(user_id, serial, id)上建立索引。

使用索引,left join可能具有同等的性能:

select u.name, ub.id as user_bags, us.id as user_storage, ust.id as user_store
from users u left join
     user_bags ub
     on ub.serial = 'abc' and ub.user_id = u.id left join
     user_storage us
     on us.serial = 'abc' and us.user_id = u.id left join
     user_store ust
     on ust.serial = 'abc' and ust.user_id = u.id
from users;

答案 1 :(得分:0)

这是我可以根据给定信息做的最好的事情。

让我为您进行一些重组/标准化。

SELECT users.name AS [user_name],
    user_bags.id AS user_bags,
    user_storage.id AS user_storage,
    user_store.id AS user_store
FROM users
LEFT JOIN user_store ON user_store.user_id = users.id
LEFT JOIN user_bags ON user_bags.user_id = users.id AND user_bags.serial = user_store.serial
LEFT JOIN user_storage ON user_storage.user_id = users.id AND user_storage.serial = user_store.serial
WHERE user_store.serial = 'abc'

确保您具有涵盖的索引:

CREATE INDEX IX_users_ID ON Users ( ID )
CREATE INDEX IX_user_store_ID_Serial ON user_store ( ID, serial )
CREATE INDEX IX_user_bags_ID_Serial ON user_bags ( ID, serial )
CREATE INDEX IX_user_storage_ID_Serial ON user_storage ( ID, serial )

可以从此处提高性能,但是我需要了解表,查看查询计划并了解其透视记录数。