2016-03-25 2 views
0

В моей базе данных у меня есть 9 таблиц, и мне нужно создать представление.Query IsDeleted = 0 во всех таблицах

Это представление, в конечном счете, будет запрашивать все таблицы. Одна консистенция здесь состоит в том, что во всех таблицах для IsDeleted имеется столбец. Как запустить запрос для проверки столбца во всех таблицах, где IsDeleted = 0?

три таблицы: Клиенты, County, Страна

Это мой Вид:

CREATE VIEW vwTEST 
AS 
SELECT 
    Cus.CustomerId, 
    Cus.FirstName, 
    Cus.LastName, 
    Cty.CountyName, 
    Cry.CountryName 
FROM 
    Customers Cus 
LEFT JOIN 
    County Cty 
ON 
    Cus.CountyId = Cty.CountyId 
WHERE 
    Cus.IsDeleted = 0 
LEFT JOIN 
    Country Cry 
ON 
    Cus.CountryId = Cry.CountryId 
WHERE 
    Cry.IsDeleted = 0 

Table formats

ответ

0

Это зависит от того, какого результата вы хотите. Если вы хотите иметь также тех клиентов, которые не удалены, но есть графство или Страна удален, то вы должны сделать подзапросы, чтобы выбрать только Восстановленные записи и присоединиться:

CREATE VIEW vwTEST 
AS 
SELECT 
    Cus.CustomerId, 
    Cus.FirstName, 
    Cus.LastName, 
    Cty.CountyName, 
    Cry.CountryName 
FROM 
    Customers Cus 
LEFT JOIN 
(SELECT 
    County.CountyId, 
    County.CountyName 
    FROM County 
    WHERE County.IsDeleted = 0) AS Cty ON Cus.CountyId = Cty.CountyId 
LEFT JOIN 
(SELECT 
    Country.CountryId, 
    Country.CountryName 
    FROM Country 
    WHERE Country.IsDeleted = 0) AS Cry ON Cus.CountryId = Cry.CountryId 
WHERE Cus.IsDeleted = 0; 

Результат (здесь со всеми поля) будет:

enter image description here

Если вы хотите только строки, в которых не удаляется ничего, то это просто:

SELECT 
* 
FROM Customers Cus 
LEFT JOIN County Cty ON Cus.CountyId = Cty.CountyId 
    LEFT JOIN Country Cry ON Cus.CountryId = Cry.CountryId 
WHERE Cus.IsDeleted = 0 AND Cty.IsDeleted = 0 AND Cry.IsDeleted = 0; 

и результат будет:

enter image description here

Мой тестовый набор данных, в результате стыки без каких-либо WHERE условие как:

SELECT 
* 
FROM Customers Cus 
LEFT JOIN County Cty ON Cus.CountyId = Cty.CountyId 
    LEFT JOIN Country Cry ON Cus.CountryId = Cry.CountryId; 

является:

enter image description here

С уважением

+0

Спасибо, Белое перо, я думаю, что знаю, что вы думаете. Когда я применяю ваш запрос, я получаю.Msg 156, уровень 15, состояние 1, процедура vwTEST, строка 13 Неверный синтаксис рядом с ключевым словом «ВКЛ». Msg 156, Level 15, State 1, Процедура vwTEST, Строка 17 Неверный синтаксис рядом с ключевым словом «ON». « –

+0

Я изменил его, произошла ошибка. Я обновляю снова альтернативу за несколько минут. –

+0

Заключительное обновление , все опробованные запросы и набор данных. –

1

Проблема заключается в том, что когда внешний (то есть LEFT) соединяется с таблицей, но имеет условие в этой таблице в предложении WHERE, вы фактически превращаете соединение в внутри. Это связано с тем, что при условии, что условия условия выполняются после, тогда производится ион, но пропущенные соединения имеют все нули для своих столбцов, поэтому любое сравнение не удастся.

Решение двигаться все условия на внешних соединяемых таблиц в предложении присоединиться ON-х, который выполнен как присоединиться сделан.

CREATE VIEW vwTEST AS 
SELECT 
    Cus.CustomerId, 
    Cus.FirstName, 
    Cus.LastName, 
    Cty.CountyName, 
    Cry.CountryName 
FROM Customers Cus 
LEFT JOIN County Cty 
ON Cus.CountyId = Cty.CountyId 
    AND Cus.IsDeleted = 0 
LEFT JOIN Country Cry 
ON Cus.CountryId = Cry.CountryId 
    AND Cry.IsDeleted = 0 

Этот запрос по-прежнему позволяет округу, и страна не присоединяется, когда доступны только удаленные строки.

Похоже, вы инстинктивно это знали, но не знали синтаксиса, чтобы выразить это, поскольку все, что мне нужно было сделать, это изменить WHERE на AND.

Смежные вопросы