2014-09-19 81 views
1

请我有5个表:SQL,联合查询

  • cosmeticproducts(IDP,产品名称,#IDC)
  • domesticproducts(IDDP,说明,参考,#IDC)
  • 用户(IDU,u_name )
  • 命令(IDC,#用户ID,日期)
  • 市场(IDM,#userid,marketname,位置)

我想牛逼o显示所有记录:

u_name|date  |marketname|location|productname|description|reference 
ali |12-06-2012|Aldi  |DE  |   | TABLE  |65416 
sab |12-06-2013|Aldi  |DE  | makeup |   | 
sir |12-06-2010|MG  |FR  |   | chairs |416 

我们可以用union来做这个吗?但我认为对于联盟,我们应该在具有相同数字的表中具有相同的属性,或者在我的情况下,例如cosmeticproducts表包含较少的属性,然后domesticproducts

请帮我。我们如何才能做到这一点? 在此先感谢:)

+0

在所描述的表格中,您没有所有需要的列,您想显示 – 2014-09-19 09:42:08

+0

是否可以显示所有表格结构? – 2014-09-19 09:57:14

回答

1

通过在select中使用空值,可以组合具有不同/缺失列的联合表。

例如:

SELECT a.Column1 AS 'Col1', 
     a.Column2 AS 'Col2', 
     null AS 'Col3', 
     a.Column4 AS 'Col4' 
FROM TableA AS a 
UNION ALL 
SELECT b.Column1 AS 'Col1', 
     b.Column2 AS 'Col2', 
     b.Column3 AS 'Col3', 
     null AS 'Col4' 
FROM TableB AS b 

我不知道这是否会与您的具体问题帮助,但应该可以帮助您与工会。

+0

非常感谢这是我搜索的内容:)非常感谢! – user3481058 2014-09-19 11:27:29

+2

请注意下面以** select u_name,cast(null as date)dt **开头的例子,您必须确保“TYPES”列也适用于数据。如果在顶部查询中使用'CAST(NULL AS ...)',它可以提供帮助。 – 2014-09-19 12:49:36

+0

啊好吧非常感谢@Used_By_Already对你的评论!它真的帮助我:)再次感谢:) – user3481058 2014-09-19 12:54:23

1

我们可以用union来做到这一点吗?不!

这是方式更多UNIONUNION ALL可以实现。 您期待来自不同表格的数据对齐到单行。这不是UNION所做的。

比方说,我们有如下信息:

users 
(idu, u_name) 
    1  ali 

commands 
(idc,#userid,date) 
    X  1 12-06-2012 

所以我们创造了以下查询:

 select u_name , cast(null as date) dt 
     from users 
UNION ALL -- union would produce the exact same result 
     select null, date 
     from commands 

这就是你会得到的结果:

U_NAME DT 
ali NULL 
NULL 12-06-2012 

2排!

然而,如果你使用JOINSMIGHT越来越接近,这个查询:

SELECT u_name , c.date 
FROM users u 
INNER JOIN commands c ON u.idu = c.#userid 

会产生这样的结果:

U_NAME DATE 
ali 12-06-2012 

它是在剩余的表要复杂得多因为在所有情况下都不清楚联接是如何的,但也是因为某些表可能有多行用于联接,并且突然之间您会得到比您更多的行xpected。

现在,让我们说,我们也有这样的数据:

market 
(idm, #userid, marketname, location) 
    Y1  1  ALDI   DE 
    Y2  1  MG   FR 

所以我们包括为使用我们的查询该联接:

SELECT u_name , c.date, m.marketname, m.location 
FROM users u 
INNER JOIN commands c ON u.idu = c.#userid 
INNER JOIN market m ON u.idu = m.#userid 

NOW我们得到这样的结果:

U_NAME DATE  MARKETNAME LOCATION 
ali 12-06-2012 ALDI   DE 
ali 12-06-2012 MG   FR 

您的要求根本无法完全满足,无需提供来自每个表格的一些样本数据以及与您提供的数据相关的“预期结果”。

+0

对不起,你还没有理解我的问题!我知道工会做了什么,我知道联盟和联盟之间的差异!但真的非常感谢您的帮助和时间:) – user3481058 2014-09-19 12:28:20

+0

那么为什么要问是否可以用UNION完成; **如果你已经知道联盟是怎么做的?**认真地重新思考你的问题,并用样本数据和预期结果来准备。 – 2014-09-19 12:33:18

+0

在我的问题中,我想知道我们如何才能完全使用它。 – user3481058 2014-09-19 12:35:42