MySql查找一个语句中的3个表中是否存在记录

时间:2015-08-24 10:26:33

标签: mysql

我要删除供应商,但在此之前我想确保其他表中没有相关数据(例如订单等)。由于我在任何地方都有适当的外键约束,最简单的方法是在供应商表上执行delete语句并在处理程序中捕获错误,然后告诉用户删除是不可能的。

然而,仅仅为了兴趣,我想知道我是否可以在一个语句中检查依赖记录的存在,结果传递一个数字。到目前为止,我想出了

    Const chkSQL As String = _
        "SELECT COUNT(*) FROM bestellungen WHERE LiefID= @LiefID UNION " & _
        "SELECT COUNT(*) FROM lieferungen WHERE LiefID= @LiefID UNION " & _
        "SELECT COUNT(*) FROM lieferantenartikel WHERE LiefID= @LiefID"

但是这将提供3行各自的计数。如果我使用ExecuteScalar(我希望我得到3个值的总和),我似乎只得到最后一个表的结果。我已经尝试过SUM,但不知怎的,我无法正确使用语法。

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

如果你想要连续所有3个表的总和,那么;

select sum(cnt) as total_cnt
from (
  SELECT COUNT(*) as cnt FROM bestellungen WHERE LiefID= @LiefID UNION all
  SELECT COUNT(*) as cnt FROM lieferungen WHERE LiefID= @LiefID UNION all
  SELECT COUNT(*) as cnt FROM lieferantenartikel WHERE LiefID= @LiefID
) x

此处使用union all union将从结果中排除类似的cnt,这不是首选。

答案 1 :(得分:0)

如果您执行3个不同的选择,您将始终获得3个不同的结果!除非您解析并替换编程语言或其他内容的响应。尝试这样的事情,而不是:

Const chkSQL As String = _
            "SELECT COUNT(*) FROM bestellungen WHERE LiefID= @LiefID UNION " & _
            "SELECT COUNT(*) FROM lieferungen WHERE LiefID= @LiefID UNION " & _
            "SELECT COUNT(*) FROM lieferantenartikel WHERE LiefID= @LiefID"

尝试使用这样的东西:

Const chkSQL As String = 
            "SELECT count(a.*), count(b.*), count(c.*) FROM bestellungen a, lieferungen b, lieferantenartikel c WHERE LiefID= a.@LiefID UNION and LiefID= b.@LiefID UNION and LiefID= a.@LiefID

答案 2 :(得分:0)

您可以在外键上设置ON DELETE RESTRICT行为,而不是手动检查是否存在相关条目。

这样,当您尝试在父行上执行DELETE时,如果存在引用该父行的值的子行,则查询将失败。如果父行没有引用子行,则可以删除该父行。

添加ON DELETE RESTRICT的一种方法是创建表格:

CREATE TABLE child_table (
  ...
  col_id INT,
  FOREIGN KEY fk_col (col_id) REFERENCES parent_table (col_id) ON DELETE RESTRICT
) ENGINE=InnoDB;