【发布时间】:2015-09-04 20:14:45
【问题描述】:
请注意,我知道它一定很简单而且可能很明显 - 我只是看不到它...如上所述,你知道为什么这个 sql 查询在 SQL Server 上执行时会返回空列表(通过 SQL Server Management Studio),提供适当的表中有数据并且查询的所有参数都设置正确?
这个问题与我的另一个问题(Does anyone know why JPQL query on a view with SQL Server does not work? 'GetResultList' always returns empty list)相关,但在这个阶段它实际上变成了一个单独的主题,所以我把它放在这里。这是查询:
SELECT t1.Id,
t2.IdTransiti,
t1.CodiceCaricoPericoloso,
t1.Confidenza,
t1.Istante,
t1.IstanteRicezione,
t2.SQLServer_latitude,
t2.SQLServer_longitude,
t1.Partizione,
t1.Targa,
t1.TargaSecondaria,
t1.UtmcInstanceId,
t1.VelocitaStimata,
t1.IdColore,
t1.IdCorsia,
t1.IdMarca,
t1.IdModello,
t1.IdNazionalita,
t1.IdSerie,
t1.IdTipologiaVeicolo
FROM dbo.TransitiView t1
LEFT OUTER JOIN Serie t0
ON (t0.Id = t1.IdSerie)
LEFT OUTER JOIN dbo.Colori t3
ON (t3.Id = t1.IdColore)
LEFT OUTER JOIN Modelli t4
ON (t4.Id = t1.IdModello)
LEFT OUTER JOIN Marche t5
ON (t5.Id = t1.IdMarca),
TransitiPunti t2,
Corsie t6
WHERE ( ( ( ( ( (t6.Attiva = 1)
AND (t1.Istante BETWEEN '2015-09-03 00:16:50.693'
AND '2015-09-03 23:16:50.693'))
AND ( (t1.Partizione = 0) OR (t1.Partizione = 6)))
AND (t1.IdCorsia = 1))
AND (t2.IdTransiti = t1.Id))
AND (t6.Id = t1.IdCorsia))
ORDER BY t1.Istante DESC
编辑:
感谢 russ 的回答,我现在知道发生了什么 - SQL Server 不喜欢内部连接中的空记录 - 奇怪! 请问,你们中的任何人都知道如何以及是否可以进行 SQL Server“LIKE”内部联接,其中联接表的相应列中可能缺少条目? 或者...至少如何让它适用于这个特定的查询?
我想这样做:...ON (t2.IdTransiti = t1.Id or t2.IdTransiti is null) 但这对于 SQL Server 来说还不够好。它没有帮助:(。
BONUS QUESTION:知道为什么当通过内部连接连接的表可能为空时,MySQL 可以,但 SQL Server 不行?为什么这首先是不行的?
编辑:
问题解答:
感谢 russ - 我基本上明白了 - 这只是我的困惑,仅此而已。请在接受的答案下阅读 cmets。一切都源于我忘记的事实,不知道 JPA 中的 @SecondaryTable 注释会转化为内部连接,然后是双重混淆 - 我无视 这显然是在两个表中都期望内部连接!!!
感谢大家的努力,我想在下一次陈述事情之前我必须多考虑一下:)。
【问题讨论】:
-
不要混合显式连接语法和旧的隐式连接!!!太容易出错了——只使用新的、显式的连接语法!!!
-
将 t2 等条件从 WHERE 移动到 ON,以获得真正的 LEFT JOIN。 (就像现在一样,它作为常规内部连接执行......)
-
@jarhl 谢谢 Jahrl!但有趣的是,这个查询实际上是由我的项目中的 Microsoft sqljdbc4.jar 驱动程序自动生成的,我希望它不会出错?你知道这里可能是什么原因吗?另外 - 你知道这个查询是否真的有什么问题吗,因为它确实执行没有错误,除了它只返回一个空列表。
-
@jahrl Aaaahhhh ...就是这样!但是你知道为什么会这样吗? Java 端的相同代码(此处不相关的细节)将 ojdbc 驱动程序与 MySQL 一起使用,它必须生成正确的 sql 语法,因为我从来没有得到一个空列表,为什么 sqljdbc4.jar 驱动程序和 SQL Server 会失败?这实际上是自动生成的代码。
-
驱动程序不会“自动生成”任何语句。驱动程序只执行 Java 程序传递给它的语句。另外,如果使用“ojdbc 驱动程序”,您的意思是
ojdbc6.jar,那么这适用于 Oracle,而不适用于 MySQL。
标签: sql sql-server