【问题标题】:Union SQL query in phpphp中的联合SQL查询
【发布时间】:2021-01-22 03:27:29
【问题描述】:

我在尝试使用UNION SQL 查询链接 5 个表时遇到问题。问题之一是我需要的每个 SQL 查询中由UNION 分隔的元素数量不同。当我在查询中使用 '' 使每个查询中的元素数量相等时,它只显示第一个查询的结果。这是链接 5 个表的查询。

(SELECT a.a1,b.b1 
      FROM a,b 
     WHERE a.a2 = b.b2) 
   UNION
   (SELECT a.a1,c.c1 
      FROM a,c 
     WHERE a.a3 = c.c3) 
   UNION
   (SELECT a.a1,d.d1,d.d2 
      FROM a,d 
     WHERE a.a4 = d.d4) 
   UNION
   (SELECT a.a1,e.e1,e.e2,e.e3 
      FROM a,e 
     WHERE a.a5 = e.e5)

这显示了一个错误,而当我重写它以使元素数量相等(这里为 4)为:

(SELECT a.a1,b.b1,'','' 
      FROM a,b 
 WHERE a.a2 = b.b2) 
UNION
(SELECT a.a1,c.c1,'','' 
   FROM a,c 
  WHERE a.a3 = c.c3) 
UNION
(SELECT a.a1,d.d1,d.d2,'' 
   FROM a,d 
  WHERE a.a4 = d.d4) 
UNION
(SELECT a.a1,e.e1,e.e2,e.e3 
   FROM a,e 
  WHERE a.a5 = e.e5)

我只得到第一个查询的结果,即 SELECT a.a1,b.b1,'','' from a,b where a.a2 = b.b2 的结果

【问题讨论】:

  • UNION 表示尝试获取的列数必须相同。
  • 是的,所以我使用 '',使列返回相同,但我只得到第一个查询的结果(实际上有 4 个查询由联合分隔)
  • 你确定你只从第一个查询中得到结果吗?原因,结果列名将与第一个查询相同
  • 补充一下 Rahul 所说的,合并的联合查询确实只会显示第一次选择的列的名称。可能是这样,因此您误解了,因为仅显示第一个查询的结果。 OKie 现在验证它 - 唯一的方法是在 SSMS 中单独触发这 5 个查询,然后您将立即知道您的猜测是否正确。
  • 是的,我只得到第一个查询的结果,即使单独运行子查询正在给出结果(单独)

标签: mysql sql union


【解决方案1】:

也许这些查询会返回许多重复项。尝试使用UNION ALL 而不是UNION,因为后者会删除重复的行。

【讨论】:

  • @work 仍然只有一行?然后你需要对这些子查询一一进行测试。因为其中一些似乎没有返回任何东西。
  • 第三个查询最后 3 行为空 SELECT a.a1,d.d1,d.d2,'' FROM a,d WHERE a.a4 = d.d4) =>d.d1 和d.d2 是空的,只有 a.a1 有值
【解决方案2】:

我建议单独运行每个单独的语句,并确定您是否从每个语句中获得了预期的结果。

【讨论】:

    【解决方案3】:

    我建议使用 UNION ALL 并为每个部分添加一个标识符,例如

     SELECT "q1" AS src, a.a1, b.b1, NULL, NULL
     FROM a
     JOIN b ON a.a2 = b.b2
    UNION ALL
     SELECT "q2" AS src, a.a1, c.c1, NULL, NULL
     FROM a
     JOIN c ON a.a3 = c.c3 
    [...]
    

    这样你至少应该能够找出你的 UNION 的哪一部分返回数据

    【讨论】:

      【解决方案4】:

      使用NULL,而不是空字符串:

         SELECT a.a1, b.b1, NULL, NULL
           FROM a
           JOIN b ON a.a2 = b.b2
         UNION
         SELECT a.a1, c.c1, NULL, NULL
           FROM a
           JOIN c ON a.a3 = c.c3 
         UNION
         SELECT a.a1, d.d1, d.d2, NULL
           FROM a
           JOIN d ON a.a4 = d.d4
         UNION
         SELECT a.a1, e.e1, e.e2, e.e3 
           FROM a
           JOIN e ON a.a5 = e.e5
      

      NULL 不是一个值——它是一个没有任何值的占位符。

      这是必要的,因为UNION 语句(包括UNION ALL)要求所有联合 SELECT 语句中返回的列数相同,并且数据类型应该匹配。

      如果您仍然没有看到您期望的数据,您需要单独查看每个语句以确保它实际返回数据。连接可能没有像您预期的那样工作......

      【讨论】:

      • NULL 也给出相同的结果没有变化。
      • 如果我不使用 NULL 和 '' 但如果我从每个查询中只取 2 列,我会得到正确的结果。使用 NULL 和 '' 不会带来正确的结果
      • @work:正如我上一个声明所说,那么您需要单独查看每个声明。
      • 单独返回值
      • 我认为问题是当在剩余的 3 个查询中的任何一个中的第一个查询中找不到列名时,在运行 sql 时不会显示第一个查询中不存在的列名。我认为只显示公共列,(第一个查询中的某些列与第二、第三和第四个查询中使用的列相等)
      猜你喜欢
      • 1970-01-01
      • 2013-06-07
      • 2019-05-08
      • 2017-11-02
      • 2013-03-31
      • 1970-01-01
      • 1970-01-01
      • 2012-03-31
      • 1970-01-01
      相关资源
      最近更新 更多