Sql内连接查询

时间:2015-03-31 16:27:43

标签: sql sql-server

我正在处理此查询,并且不知道如何在3个不同的表上使用内部联接,其中一个表仅与其他2个表链接。

个人查询工作正常:

SELECT sl_letter_batch,cctvpcn_run_date,cctvpcn_post_date 
FROM cctvpcn_batches,statutory_letter 
WHERE sl_system_ref = 1095278 and sl_letter_batch = cctvpcn_batch 
ORDER BY cctvpcn_run_date

SELECT sl_letter_batch,nto_run_date,nto_post_date 
FROM nto_batches,statutory_letter 
WHERE sl_system_ref = 1095278 and sl_letter_batch = nto_batch 
ORDER BY nto_run_date

现在,如果我想内连接相同的表:

SELECT sl_letter_batch,cctvpcn_run_date,cctvpcn_post_date 
FROM cctvpcn_batches,statutory_letter 
  INNER JOIN nto_batches,statutory_letter and sl_letter_batch = nto_batch
 and sl_letter_batch = cctvpcn_batch  
 WHERE sl_system_ref = 1095278
 ORDER BY nto_run_date

我知道这只是尝试不同的语法错误。 因为sl_letter_batch在两个表中具有不同的值。我得到的结果是null。

sl_letter_batch cctvpcn_run_date    cctvpcn_post_date
21326   2014-10-07 12:45:06.000 2014-10-07 00:00:00.000
21571   2014-11-25 14:13:55.000 2014-11-25 00:00:00.000

sl_letter_batch nto_run_date    nto_post_date
21502   2014-11-13 09:06:24.000 2014-11-13 00:00:00.000
21785   2015-01-05 14:30:42.000 2015-01-05 00:00:00.000

无论如何都要编写此查询以通过连接获取两个表结果。

2 个答案:

答案 0 :(得分:0)

试试这样:

select sl_letter_batch,cctvpcn_run_date,cctvpcn_post_date 
from cctvpcn_batches inner join statutory_letter on sl_letter_batch = cctvpcn_batch
inner join nto_batches on sl_letter_batch = nto_batch
 where sl_system_ref = 1095278
order by nto_run_date

修改

您需要有一个列,您可以使用该列加入表。像这样:

select sl_letter_batch,cctvpcn_run_date,cctvpcn_post_date 
from cctvpcn_batches c inner join statutory_letters s on c.id= s.id
inner join nto_batches n on s.id= n.id
 where s.sl_system_ref = 1095278
order by n.nto_run_date

答案 1 :(得分:0)

这里混合了两种sql样式 - 新旧。在旧 - 使用","

加入的2个表
.. FROM cctvpcn_batches, statutory_letter WHERE ...

in new - used syntax" JOIN tableName ON id1 = id2 ..." - 这里只有一张桌子和#34; JOIN"每个"加入"单词应该匹配" ON"。

SELECT ...
FROM cctvpcn_batches
INNER JOIN statutory_letter
      ON    sl_letter_batch = cctvpcn_batch
INNER JOIN nto_batches
      ON    sl_letter_batch = nto_batch
WHERE ...

您仍然可以组合样式。

SELECT ...
FROM cctvpcn_batches, statutory_letter
INNER JOIN nto_batches
        ON sl_letter_batch = nto_batch
WHERE sl_letter_batch = cctvpcn_batch
      ...

配对"加入......开......"也可以用作括号:

SELECT ...
FROM cctvpcn_batches
INNER JOIN nto_batches
    INNER JOIN statutory_letter
    ON    sl_letter_batch = cctvpcn_batch
ON sl_letter_batch = nto_batch
WHERE ...

这里我们加入" nto_batches"但在此之前加入" statutory_letter"到" cctvpcn_batches"。这就是为什么有两个顺序" ON" - 首先是" statutory_letter",第二个 - 用于" nto_batches"

如果您需要 OUTER 加入(包括不匹配),那么:

SELECT ...
FROM statutory_letter 
LEFT OUTER JOIN cctvpcn_batches
      ON    sl_letter_batch = cctvpcn_batch
LEFT OUTER JOIN nto_batches
      ON    sl_letter_batch = nto_batch
WHERE ...