Sql内部联接查询
我正在处理这个查询,只是不知道如何在3个不同的表上使用内部联接,其中一个表仅与其他2个表链接 个别查询工作正常: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
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 ...