MySQL"左外连接"问题

时间:2016-05-03 05:20:37

标签: mysql outer-join

"左外连接"中的大问题

" MYDATA"表模式 pk1为varchar,pk2为varchar,pk3为datatime,value1为int,value2为int

左外连接SQL

select a.pk1,a.pk3,a.value1,a.value2,b.value1,b.value2 
from mydata as a 
left outer join mydata as b 
    on (a.pk1=b.pk1 and b.pk2='data2' and a.pk3=b.pk3) 
where a.pk1='abc' and a.pk2='data1' and a.pk3>='2016/5/3 15:00' and
    a.pk3 <= '2016/5/3 16:00' 
pk3使用&gt; =&amp;&#; &lt; =,选择结果

abc ,2016/5/3 15:00 , 1,1,2,2 
abc ,2016/5/3 15:30 , 2,2,9,9 
abc ,2016/5/3 16:00 , 3,3,12,12 

但是当我使用a.pk3 =&#39; 2016/5/3 15:00&#39;时,选择结果

abc ,2016/5/3 15:00 , 1,1,null,null 

我在MS SQL上尝试,选择结果

abc ,2016/5/3 15:00 , 1,1,2,2 

不同的是什么?我应该如何修复MySQL sql stirng,因为我需要MS SQL做的结果?

======================

CREATE TABLE `mydata` (
`pk1` char(20) NOT NULL,
`pk2` char(10) NOT NULL,
`pk3` datetime NOT NULL,
`value1` int NOT NULL,
`value2` int NOT NULL,
 PRIMARY KEY (`pk1`,`pk2`,`pk3`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
顺便说一句,如果我使用a.pk3&gt; =&#39; 2016/5/3 15:00&#39;和a.pk3&lt; =&#39; 2016/5/3 15:00&#39; ,以及选择结果

abc ,2016/5/3 15:00 , 1,1,2,2

========================

select a.pk1,a.pk3,a.value1,a.value2,b.value1,b.value2 
from mydata as a 
left outer join mydata as b 
    on (a.pk1=b.pk1 and b.pk2='data2' and a.pk3=b.pk3) 
where a.pk1='abc' and a.pk2='data1' and a.pk3>='2016/5/3 15:00' 

abc ,2016/5/3 15:00 , 1,1,2,2 
abc ,2016/5/3 15:30 , 2,2,9,9 
abc ,2016/5/3 16:00 , 3,3,12,12 
....
....

=========================

是的,将sql字符串修复为a.pk3 = convert(&#39; 2016/5/1 09:30&#39;,datetime)将解决此问题。

2 个答案:

答案 0 :(得分:1)

由于您没有提供更多代码和插入的数据,我们只能猜测:

表中的时间戳可能是几秒或几毫秒。它匹配条款a.pk3 >= '2016/5/3 15:00' AND a.pk3 <= '2016/5/3 16:00'但不等于第一个值。在您的显示格式中,秒和毫秒只是被切断,但比较取决于内容,而不是显示的内容。

答案 1 :(得分:0)

查询看起来很简单。我猜mydata表没有MySQL中pk3='2016/5/3 15:00' 的记录

您可以使用查询来测试此信息 select * from mydata where pk3='2016/5/3 15:00' MySQL

如果上面的查询只返回任何内容,但您可以看到pk3='2016/5/3 15:00'的记录,则可能是格式化的情况,在这种情况下您需要转换为日期时间

select * from mydata where pk3=convert('2016/5/3 15:00', datetime)