SQL - 加入两个表但只显示特定值

时间:2013-08-08 07:54:32

标签: sql database


好吧,所以我创建了一个名为news的数据库,其中包含几个包含不同信息的表。我有两个表名为员工,另一个表名为文章

现在我想从员工表中获得的是姓名(员工姓名)和职称。从Article表中我希望它显示每个Employee一直在写什么类型的文章,因为它们是通过ArticleID连接的。但我只想要一个特定的ArticleID来显示例如numer 2.这是我想要显示的输出的一个例子。

                   Titel         Name            ArticleID   
                   Redirector    Jonas              2
                   journalist    Clark              2
                   journalist    Louise             2      



这是我用我的SQL代码到底有多远,但是我无法让它工作,他们错误地说我得知p.Employee不存在。

 SELECT p.Titel, p.Name, ap.ArticleID
    FROM Employee p join
         Article ap
         on p.Employee  = ap.Article
    WHERE ap.ArticleID IN (2);

对此的一些帮助将不胜感激。

编辑----------------- 表结构如何显示。对由此带来的不便表示歉意。

表员工

EmployeeID  Name    UserName    Pass      Titel         PhoneNumer 
    1       Clark    xxxxxx      a      journalist       12356465
    2       Louise   aaaaaa      b      journalist       45648984
    3       Jonas    bbbbbb      c      Redirector       489489448

表文章

 ArticleID      KategoriID       preamble    Body   headlines         Published
    1              1             dwadwad
    2              2              qweqw
    3              3              dwqdqw

2 个答案:

答案 0 :(得分:5)

您的查询现在的样子,就像表通过Employee.Employee和Article.Article连接一样。

你描述它的方式,链接在ArticleID上,所以听起来应该是:

SELECT 
  p.Titel, p.Name, ap.ArticleID
FROM 
  Employee p 
  INNER JOIN Article ap
     ON p.ArticleID  = ap.ArticleID
WHERE 
  ap.ArticleID IN (2); -- Or just ` = 2`

但是我怀疑一个员工可以写多篇文章,在这种情况下,一篇文章有​​一个EmployeeID更有意义,而EmployeeID定义了这种关系:

SELECT 
  p.Titel, p.Name, ap.ArticleID
FROM 
  Employee p 
  INNER JOIN Article ap
     ON p.EmployeeID  = ap.EmployeeID
WHERE 
  ap.ArticleID IN (2); -- Or just ` = 2`

虽然多名员工可以共同撰写文章也是合理的。因此,如果您还希望有一个员工写多篇文章的可能性,那么您需要一个联结表,您的查询将如下所示:

SELECT 
  p.Titel, p.Name, ap.ArticleID
FROM 
  Employee p 
  INNER JOIN EmployeeArticle ea
     ON ea.EmployeeID = p.EmployeeID
  INNER JOIN Article ap
     ON ap.ArticleID  = ea.ArticleID
WHERE 
  ap.ArticleID IN (2); -- Or just ` = 2`

在最后一种情况下,EmployeeArticle只包含两个字段EmployeeID和ArticleID,允许您将多个员工链接到多个文章(n..m关系)。如果您不需要文章本身的任何字段,您可以省略Article的联接,并写下:

WHERE 
  ea.ArticleID IN (2); -- Or just ` = 2`

毕竟,ID已存在于联结表中。

答案 1 :(得分:1)

需要加入ON表格列。我认为表Employee没有列Employee和Article ... column Article。

SELECT p.Titel, p.Name, ap.ArticleID
    FROM Employee p join
         Article ap
         on p.ArticleID = ap.ID -- for relation Article 1 : N Employee
       --on p.ID = ap.RefToEmployee -- for relation Article N : 1 Employee
    WHERE ap.ArticleID = 2;

编辑(在发布表格结构之后):

SELECT p.Titel, p.Name, ae.ArticleID
    FROM Article_Employee ae join
         Employee p
         on p.EmployeeID = ae.EmployeeID
    WHERE ae.ArticleID = 2;