Почему SQL запросов SQL Server возвращает пустой список?

голоса
-1

Пожалуйста , обратите внимание , я знаю , что это должно быть что - то простое и , вероятно , очевидно , - я просто не могу видеть его ... Как уже говорилось, вы знаете , почему этот SQL запрос вернет пустой список , когда выполняется на SQL Server ( с помощью SQL Server Management Studio), при условии , что Eсть ДАННЫХ ТАБЛИЦЫ И СООТВЕТСТВУЮЩИЕ ВСЕХ ПАРАМЕТРОВ ЗАПРОСА установлены правильно?

Этот вопрос связан с моим другим вопросом ( Кто - нибудь знает , почему JPQL запрос на представлении с SQL Server не работает? «GetResultList» всегда возвращает пустой список ) , но на данном этапе он фактически превращается в отдельную тему, так что поэтому я поместил это здесь. Вот запрос:

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 не любит пустые записи в внутренних соединениях - ODD !! Пожалуйста, не любой из вас знают , как и , если это возможно сделать SQL Server «LIKE» внутренние соединения , где элементы могут отсутствовать в соответствующих графах в соединяемых таблиц? Или ... По крайней мере , как заставить его работать для этого конкретного запроса?

Я думал сделать это: ... ON (t2.IdTransiti = t1.Id или t2.IdTransiti равна нулю), но это не достаточно хорошо для SQL Server. это не помогло :(.

БОНУС ВОПРОС: Любая идея, почему это нормально для MySQL, но не для SQL Server при таблиц, соединенных с помощью внутренних соединений может быть пустым? Почему это должно быть не в порядке в первую очередь?


РЕДАКТИРОВАТЬ:

ОТВЕТ НА ПРОБЛЕМЫ: Благодаря Russ - я в основном получил его - это только мое замешательство , и больше ничего. Пожалуйста , прочтите комментарии по принятому ответу. Все связано с тем , что забыл, не знал , что @SecondaryTableаннотации в JPA переводит внутреннее соединение , а затем двойной путаницы - мое пренебрежение , ЧТО ОЧЕВИДНО INNER JOIN ОЖИДАЕТ ЗНАЧЕНИЯ В ОБОИХ ТАБЛИЦЫ !!!

Спасибо всем за их усилия, и я предполагаю, что я должен думать немного больше, прежде чем о том, вещи в следующий раз :).

Задан 04/09/2015 в 07:06
пользователем
На других языках...                            


2 ответов

голоса
0

Если вы думаете , таблица [TransitiPunti] не имеет записей в ней , то да , что бы остановить любой запрос , используя внутреннее соединение по этому запросу из продуцирующих строк. Примечание: Ваш существующий запрос действительно использует INNER JOIN в этой таблице (она использует старомодный синтаксис regretably, но это внутреннее соединение).

Я предлагаю вам проверить «постепенно», так что вы можете работать с проблемой. «Начните с малого», попробуйте, что, в случае успеха добавлять элементы по одному за раз и повторите попытку.

Как только вы перестанете получать результаты, которые вы знаете, что последний пункт был, что вы добавили, и это будет то, что элемент, который вызывает проблему.

Вот к примеру 3 запросов, чтобы попробовать.

/ * Одна таблица только (t1) * /

SELECT
      t1.Id
    , t1.CodiceCaricoPericoloso
    , t1.Confidenza
    , t1.Istante
    , t1.IstanteRicezione
    , 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
WHERE 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
ORDER BY t1.Istante DESC
;

/ * две таблицы (t1 & t6) * /

SELECT
      t1.Id
    , t1.CodiceCaricoPericoloso
    , t1.Confidenza
    , t1.Istante
    , t1.IstanteRicezione
    , 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
      INNER JOIN Corsie t6 ON t6.Id = t1.IdCorsia
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
ORDER BY t1.Istante DESC
;

/ * Три таблицы t1, t2, t6 * /

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
      INNER JOIN TransitiPunti t2 ON t2.IdTransiti = t1.Id
      INNER JOIN Corsie t6 ON t6.Id = t1.IdCorsia
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
ORDER BY t1.Istante DESC

НИКОГДА не используйте смесь старого присоединиться к синтаксису с (лучше) явно ANSI соединения.

Я также не люблю лишние скобки, я считаю, что они путают, а не помощь.

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
      */
      INNER JOIN TransitiPunti t2 ON t2.IdTransiti = t1.Id
      INNER JOIN Corsie t6 ON t6.Id = t1.IdCorsia
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
ORDER BY t1.Istante DESC

В вынимая скобки и коррекции синтаксиса присоединиться Я думаю, что запрос выглядит выше. Обратите внимание, что нет никакой очевидной необходимости в каком-либо из левых присоединились таблиц.

кстати, это:

AND (t1.Partizione = 0 OR t1.Partizione = 6)

может быть изменен на:

AND t1.Partizione IN (0,6)
Ответил 04/09/2015 в 07:39
источник пользователем

голоса
-1

Брекет кажется необычным, вы можете попробовать заменить текущую ИНЕКЕ с этим:

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

Если transitipunti таблица пуста, попробуйте следующее:

SELECT t1.Id,
     t1.CodiceCaricoPericoloso,
     t1.Confidenza,
     t1.Istante,
     t1.IstanteRicezione,
     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),
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 t6.Id = t1.IdCorsia
ORDER BY t1.Istante DESC

Null дружеский Соединение слева в SQL Server:

create table abc
(
a int,
b int,
c int
)

create table def
(
d int,
e int,
f int
)

insert into abc values (1,2,3)

select * from abc left join def on abc.a = def.d or def.d = null
Ответил 04/09/2015 в 08:17
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more