Как включить значения столбцов как нулевые, даже если условие не выполняется? - PullRequest
0 голосов
/ 29 мая 2020

Напишите запрос, чтобы показать ВСЕ названия зданий, название их измерительной компании и тип счетчика для всех зданий, в которых нет счетчиков с постоплатой.

Изображение 1 - результат, который я должен get и изображение 2 - это результаты, которые я получаю:

Results should be

enter image description here

USE Ultimate_DataBase
GO

SELECT [Bld_Name], [Elec_company_name], [Mtype_Name]
FROM [dbo].[Metering_Company] A
FULL OUTER JOIN [dbo].[Metering_Type] D
ON A.[MType_ID]= D.MType_ID
FULL OUTER JOIN [dbo].[Building_metering] B
ON A.[Elec_ID]= B.[Elec_ID]
FULL OUTER JOIN [dbo].[Building] C
ON C.[Bld_ID]= B.[Bld_ID]
WHERE [Mtype_Name] != 'POSTPAID' 

Ответы [ 3 ]

0 голосов
/ 29 мая 2020

FULL JOIN не кажется необходимым - на самом деле FULL JOIN почти никогда не требуется, особенно для стандартных JOIN s в хорошо структурированной базе данных.

Структура вопроса предлагает NOT EXISTS:

SELECT b.*
FROM dbo.Building b
WHERE NOT EXISTS (SELECT 1
                  FROM dbo.Building_metering bm JOIN
                       dbo.Metering_Company mc
                       ON bm.Elec_ID = mc.Elec_ID JOIN
                       dbo.Metering_Type mt
                       ON mt.MType_ID = mc.MType_ID
                  WHERE bm.Bld_ID = b.Bld_ID AND mt.Mtype_Name = 'POSTPAID' 
                 );

Вы также можете express это как LEFT JOIN и фильтрацию:

SELECT b.*
FROM dbo.Building b LEFT JOIN
     dbo.Building_metering bm 
     ON bm.Bld_ID = b.Bld_ID LEFT JOIN
     dbo.Metering_Company mc
     ON bm.Elec_ID = mc.Elec_ID LEFT JOIN
     dbo.Metering_Type mt
     ON mt.MType_ID = mc.MType_ID AND
        mt.Mtype_Name = 'POSTPAID' 
WHERE mt.MType_ID IS NULL;

Это позволяет вам выбирать столбцы из любой таблицы.

Примечания:

  • FULL JOIN почти никогда не требуется.
  • Используйте понятные псевдонимы таблиц! Произвольные буквы ничего не значат. Используйте аббревиатуры таблиц.
  • Экранирование имен столбцов и таблиц квадратными скобками только затрудняет запись и чтение кода.
0 голосов
/ 29 мая 2020
USE Ultimate_DataBase
GO

SELECT [Bld_Name], [Elec_company_name], [Mtype_Name]
FROM [dbo].[Metering_Company] A
LEFT JOIN [dbo].[Metering_Type] D
ON A.[MType_ID]= D.MType_ID
LEFT JOIN [dbo].[Building_metering] B
ON A.[Elec_ID]= B.[Elec_ID]
LEFT JOIN [dbo].[Building] C
ON C.[Bld_ID]= B.[Bld_ID]

Используйте это

0 голосов
/ 29 мая 2020

Попробуйте переместить WHERE logi c в соответствующее предложение ON:

SELECT [Bld_Name], [Elec_company_name], [Mtype_Name]
FROM [dbo].[Metering_Company] A
FULL OUTER JOIN [dbo].[Metering_Type] D
    ON A.[MType_ID]= D.MType_ID AND
       [Mtype_Name] != 'POSTPAID'              -- change is here
FULL OUTER JOIN [dbo].[Building_metering] B
    ON A.[Elec_ID]= B.[Elec_ID]
FULL OUTER JOIN [dbo].[Building] C
    ON C.[Bld_ID]= B.[Bld_ID];

Примечание. Добавьте псевдонимы к вашему предложению select. Они не являются обязательными , если предположить, что никакие две таблицы никогда не содержат столбцы с одинаковыми именами, но наличие псевдонимов упростило бы ответ на ваш вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...