【问题标题】:Mysql create table composite/join of two other tablesMysql创建表组合/连接另外两个表
【发布时间】:2014-10-30 15:56:59
【问题描述】:

我确定这很简单..我只是没有看到正确的语法..

我有两张桌子:

select * from buyTable;
+---------+------+------------+
| Quarter | Year | buyerAgent |
+---------+------+------------+
|       4 | 2007 |          1 | 
|       1 | 2008 |          2 | 
|       2 | 2008 |          1 | 

mysql> select * from sellTable;
+---------+------+-------------+
| Quarter | Year | sellerAgent |
+---------+------+-------------+
|       2 | 2008 |           1 | 
|       3 | 2008 |           1 | 

这就是我想要的:

mysql> select ?????????????
+---------+------+-------------+-------------+
| Quarter | Year | sellerAgent | buyerAgent |
+---------+------+-------------+-------------+
|       4 | 2007 |           0 |          1 | 
|       1 | 2008 |           0 |          2 | 
|       2 | 2008 |           1 |          1 |
|       3 | 2008 |           1 |          0 |

零可以是空值。不要在意。看起来这应该不会太难,但我还没有设法强迫 mysql 做我想做的事。

更新:

使用这两个建议.. 为左连接提供选择,并建议使用完全外连接.. 我想出了以下内容。就我而言,buyTable 和 sellTable 是 mysql 临时表。在 mysql 中使用临时表有一个条件,即您不能为同一查询重新打开表。因此,我必须为具有相同内容的买入和卖出创建第二个临时表。我称他们为buyTable2 和sellTable2。如果您使用的是实际的 mysql 表,则不需要这样做,并且可以适当地修改以下查询。

此外,此查询添加了第三列,用于汇总买入和卖出列。此外,它用零替换了 NULL 条目,其中对于给定季度没有任何买入(或卖出)。

(select buyTable.Quarter, buyTable.Year, ifnull(sellerAgent,0), ifnull(buyerAgent,0), 
        ifnull(sellerAgent,0)+ifnull(buyerAgent,0) 
  FROM buyTable 
  LEFT JOIN  sellTable ON 
    (buyTable.quarter = sellTable.quarter AND buyTable.year = sellTable.year)) 
union 
(select sellTable2.Quarter, sellTable2.Year, ifnull(sellerAgent,0), ifnull(buyerAgent,0),
        ifnull(sellerAgent,0)+ifnull(buyerAgent,0) 
  FROM buyTable2 
  RIGHT JOIN  sellTable2 ON 
    (buyTable2.quarter = sellTable2.quarter AND buyTable2.year = sellTable2.year));

【问题讨论】:

    标签: mysql


    【解决方案1】:

    我认为这应该可以解决问题,

    select buytable.quarter, buytable.year, sellerAgent, buyerAgent FROM buyTable LEFT JOIN  sellTable ON (buyTable.quarter = sellTable.quarter AND buyTable.year = sellTable.year)
    UNION
    select sellTable.quarter, sellTable.year, sellerAgent, buyerAgent FROM buyTable RIGHT JOIN  sellTable ON (buyTable.quarter = sellTable.quarter AND buyTable.year = sellTable.year)
    

    如果您不想要重复条目,请使用 UNION,如果您想要重复条目,请使用 UNION ALL。

    【讨论】:

    • 这行得通!它的零有空值,但就像我说的,我完全可以接受。
    • 这里还有一点.. selectbuyTable.Quarter, buyTable.Year, ifnull(sellerAgent,0), ifnull(buyerAgent,0), ifnull(sellerAgent,0)+ifnull(buyerAgent,0)从 buyTable LEFT JOIN sellTable ON (buyTable.quarter = sellTable.quarter AND buyTable.year = sellTable.year);实际上会将空值替换为零(并添加另一列将两者相加,这可能对将来某个时候的某个人有用)
    • 其实,我刚刚发现这个答案不太管用。留下的连接会导致它获取完整的 buyTable 并将 sellTable 中的条目添加到它上面......但是它缺少有卖出条目但没有买入条目的行。在这种情况下,它没有将 3/2008 行作为答案的一部分。
    【解决方案2】:
    select quarter, year, sellerAgent, buyerAgent 
    from buyTable full outer join sellTable 
    using(year,quarter);
    

    【讨论】:

    • 在 oracle 中工作。我应该正确阅读这个问题。
    • 这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方发表评论 - 您可以随时评论自己的帖子,一旦您有足够的reputation,您就可以comment on any post
    • @Jubobs True - 但它确实提供了一个巨大的线索
    猜你喜欢
    • 2012-09-03
    • 2015-07-14
    • 1970-01-01
    • 1970-01-01
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    相关资源
    最近更新 更多