SQL - 在一次SQL调用中从多个表中选择引用数据

时间:2013-01-21 08:44:10

标签: sql select

例如,我有4个表,都有说userID(可以多次引用。所以例如我可以:

Cars
id, ..., userID  // userID = owner of the car

Garages
id, ..., userID // userID = owner of the garage

Tools
id, ..., userID // userID = owner of the tool

现在我想进行查询以删除用户,但我只想在用户所有相关数据都消失的情况下删除该用户。换句话说,我想确保没有引用数据(假设我不允许使用userID = -1或null。必须将其分配给用户

我能看到进行检查的唯一方法是:

SELECT count(*) FROM Cars WHERE USERID = userID
SELECT count(*) FROM Garages WHERE USERID = userID
SELECT count(*) FROM Tools WHERE USERID = userID

我必须检查是否有任何结果大于0.有没有办法在一个SQL SELECT查询中检查N个表?

4 个答案:

答案 0 :(得分:2)

您可以将计数加起来,如下所示:

SELECT (SELECT count(*) FROM Cars WHERE USERID = userID)
     + (SELECT count(*) FROM Garages WHERE USERID = userID)
     + (SELECT count(*) FROM Tools WHERE USERID = userID)
FROM ...

如果结果为非0,则表示您有引用的用户。

答案 1 :(得分:2)

如果您想要阻止删除仍有汽车,车库或工具的用户,您应该将这些表中的外键添加到用户表中。

如果您尝试删除仍然引用的用户,您将收到一个错误,您可以捕获并处理该错误,例如通过向用户显示approriate错误消息。

这有一个额外的好处,即无论人们如何尝试删除用户(SQL命令行,应用程序中的错误代码,......),都将总是被删除。< / p>

答案 2 :(得分:1)

SELECT  (SELECT count(*) FROM Cars WHERE USERID = userID) as CarCount
,       (SELECT count(*) FROM Garages WHERE USERID = userID) as GarageCount
,       (SELECT count(*) FROM Tools WHERE USERID = userID) as ToolCount

答案 3 :(得分:0)

如果Cars是您想要更改的主要表格,您也可以尝试这样做:

SELECT count(*)
FROM   Cars 
       INNER JOIN
       Garages 
       ON Cars.USERID = Garages.USERID, 
       INNER JOIN
       Tools
       ON Cars.USERID= Tools.USERID
WHERE  Cars.USERID = SOME_USER_ID;

建议为USERID创建外键。