SQL Union来自第一个表的所有别名?

时间:2016-03-17 23:54:13

标签: mysql sql union-all

我有两张桌子

[data] - title,maker,partnum,price

[cross] - 产品(data.partnum),title,maker,partnum,price

我想要的是通过sysn编号列出所有产品。如何通过订购 - >

获得联合所有数据
  1. [数据表] Microsoft," some note",9989,$ 20
  2. [交叉表]微软经销商,"一些说明",1045,$ 30
  3. [交叉表]微软的Apple经销商:),"有些说明",2233,$ 40
  4. 虚拟间隔:)
  5. [数据表] Microsoft," some note",9989,$ 10
  6. [交叉表]联想在微软的经销商..
  7. 我正在尝试这个

    SELECT `title`,'Microsoft' AS `maker`,`partnum`,`price`
        FROM data as d
        WHERE sysn=%s
        GROUP BY partnum
    UNION ALL
        SELECT `title`,`maker`,`partnum`,`price`
        FROM cross as c
        WHERE c.product=d.partnum
        GROUP BY `partnum`
    

    由于

2 个答案:

答案 0 :(得分:0)

如果您正在使用MySQL,那么#34;交叉"是一个保留字,你必须将十字形用反引号括起来,将它用作表格名称(后面的反键是左上角键盘上的' 1')。

答案 1 :(得分:0)

你所要求的并不完全清楚。考虑在http://sqlfiddle.com中设置示例架构和数据。

“虚拟间隔”实现起来会非常混乱。这不是完全不可能的,只是凌乱。

对于以特定顺序返回的行,您将需要添加ORDER BY子句。

为什么要包含GROUP BY条款并不清楚。第一个GROUP BY上的SELECT将有效地“折叠”示例输出行1.和5.给予9989相同的值partnum。如果没有解释为什么你需要GROUP BY,我会猜测你真正想要的是ORDER BY条款。

还不清楚为什么字面值'Microsoft'需要显示在SELECT列表中,而不是maker表中的data列。这样做没有什么无效的SQL。但是如果没有解释,那就没有多大意义了。

我们应该问的问题......为什么需要这个特定的结果?是否有更容易实现的不同结果,这同样满足要求?

抛开“虚拟间隔”行,从这样的查询返回似乎满足大多数规范:

SELECT t.src
     , t.title
     , t.maker
     , t.partnum
     , t.price
  FROM (
         SELECT '[data]'         AS `src`
              , d1.title         AS `title`
              , d1.maker         AS `maker`
              , d1.partnum       AS `partnum`
              , d1.price         AS `price`
              , d1.partnum       AS `product`
           FROM data d1
          WHERE d1.sysn = ?

          UNION ALL

         SELECT '[cross]'
              , c2.title
              , c2.maker
              , c2.partnum
              , c2.price
              , c2.product
           FROM cross c2
           JOIN data d2
             ON d2.partnum = c2.product
          WHERE d2.sysn = ?
       )
 ORDER BY t.product DESC, t.src DESC, t.price ASC