Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql内部联接查询_Sql_Sql Server - Fatal编程技术网

Sql内部联接查询

Sql内部联接查询,sql,sql-server,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 S

我正在处理这个查询,只是不知道如何在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_字母_批次在两个表中具有不同的值。我得到的结果是空的

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
是否仍要编写此查询以使用联接获取两个表结果。

请尝试以下操作:

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
编辑:

你需要有一个列,你可以加入你的表。大概是这样的:

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

这里混合了两种sql风格——旧的和新的。在旧的-2表中,使用“,”连接

在新使用的语法“jointtablename ON id1=id2…”中,这里每个“JOIN”只有一个表,每个“JOIN”单词应该有匹配的“ON”

您仍然可以组合样式

SELECT ...
FROM cctvpcn_batches, statutory_letter
INNER JOIN nto_batches
        ON sl_letter_batch = nto_batch
WHERE sl_letter_batch = cctvpcn_batch
      ...
成对的“JOIN…ON…”可以用作括号:

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\U批次”,但在此之前,将“法定字母”加入“CCTV PCN\U批次”。这就是为什么有两个连续的“开”-第一个是“法定字母”,第二个是“nto批次”

如果需要外部连接(包括不匹配),则:


Rahul,这就是我提到的。如果你看到我的结果,sl_字母_批次有不同的值。结果将是空值。@pretyv5:-你有可以连接两个表的id列吗?两个表都有法定字母表,sl_字母是这两个表的id列。我不知道这是一个愚蠢的问题,还是我在跳出框框思考…@pretyv5:-在上面的查询中,您唯一需要更改的是使用列名来连接三个表的id列。您使用的是哪种DBMS?博士后?Oracle?sql server管理研究可能重复的
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 ...