Вложенный SELECT возвращает NULL в Transact SQL - PullRequest
0 голосов
/ 01 декабря 2011

Я попытался сделать SQL-запрос с вложенным SELECT для той же таблицы (UID в таблице полиморфный).

Проблема в том, что мой вложенный SELECT всегда возвращает NULL.

Вот запрос:

SELECT
    Ent.UID,
    Measurement.MeasurementClass AS Type,
    Substation.TG8000_Name AS Station,
    SUBSTRING(Measurement.TG8000_Name,1,5) AS Travee,
    SUBSTRING(Measurement.TG8000_Name,6,8) AS Equipement,
    Measurement.ClonedFromMeasurement,
    (SELECT TOP 1 TG8000_Name 
        FROM [BD_Sonel_PTG].[dbo].[Measurement]
        WHERE (UID=Measurement.ClonedFromMeasurement) )  AS Template,
    LongName.LongName AS Description,
    Measurement.MeasurementUnit AS Units,
    MeasurementLimit.LowLimit,
    MeasurementLimit.HighLimit,
    RTU.TG8000_Name AS RTUName,
    RTU.RTUProtocol,
    RTU.Configuration AS RTUConfiguration,
    Telemetry.Address,
    Measurement.DisplayName AS Display,
    REPLACE(Measurement.MeasurementClass,' ','')+':'+REPLACE(Substation.TG8000_Name,' ','')+'.'+REPLACE(Measurement.TG8000_Name,' ','') AS Tren

  FROM EntityName Ent

  LEFT JOIN LongName ON Ent.UID = Longname.UID  /* chaque point possède une description pour une langue donnée */
  LEFT JOIN Measurement ON Ent.UID = Measurement.UID /* chaque point de type measurement possède des infos suppl dansla table Measurement */
  LEFT JOIN Substation ON Measurement.Substation = Substation.UID /* chaque point est lié à l'UID d'une station (Table Substations) */
  LEFT JOIN Telemetry ON Telemetry.DataSourceFor = Ent.UID /* 1 point télémétré est lié à une entrée de Telemetry (DataSourceFor) */
  LEFT JOIN MeasurementLimit ON Ent.UID = MeasurementLimit.UID /* Chaque point de type measurement est lié à des paramètres limites */
  LEFT JOIN RTU ON Telemetry.RTU = RTU.UID /* chaque point télémétré est associé à un l'UID d'un RTU dont les paramètres sont dans la table RTU */
 /* LEFT JOIN EntityName Ent2 ON Ent.UID = Measurement.ClonedFromMeasurement*/

  WHERE Ent.EntityType = 'Measurement'

  ORDER BY Substation.TG8000_Name, Measurement.TG8000_Name;

  GO

Когда я выполняю вложенный выбор с жестко закодированным значением как 9616, он работает!

... (SELECT TOP 1 TG8000_Name 
        FROM [BD_Sonel_PTG].[dbo].[Measurement]
        WHERE (UID='9616') )  AS Template,
...

Так что я полагаю, что это доступ к Measurement.ClonedFromMeasurementкоторый не работает ...

Но, как вы видите в запросе, я также вывел значение Measurement.ClonedFromMeasurement, чтобы посмотреть, что там, и я правильно получил значение 9616 (которое меняется отстрока за строкой).

Как получить доступ к Measurement.ClonedFromMeasurement в моем вложенном запросе?

Ответы [ 2 ]

0 голосов
/ 01 декабря 2011

Является ли UID столбцом INT?Если это так, попробуйте использовать

UID=Convert(int,Measurement.ClonedFromMeasurement)

в предложении WHERE.

0 голосов
/ 01 декабря 2011

Попробуйте сделать самостоятельное соединение для этого

(SELECT TOP 1 TG8000_Name
FROM [BD_Sonel_PTG].[dbo].[Measurement] m1,m2 on
m1.UID = m2.ClonedFromMeasurement) AS Template

ИЛИ

(SELECT TOP 1 TG8000_Name
FROM [BD_Sonel_PTG].[dbo].[Measurement] 
where UID in (select distinct ClonedFromMeasurement from 
[BD_Sonel_PTG].[dbo].[Measurement]) AS Template
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...