Сравнение имени столбца в одной таблице с данными столбца в другой таблице в SQL Server - PullRequest
0 голосов
/ 16 мая 2019

Я пытаюсь сравнить имена столбцов, которые существуют как часть значений столбцов в tblFactorDefinition, с соответствующими именами столбцов с фактическими значениями в tblConstituent, чтобы найти несоответствие между этими двумя таблицами.

Я не получаю ожидаемый результат, хотя расхождение действительно существует.Я публикую нижеприведенную схему БД и примеры данных с ожидаемым выводом:

Ниже приведены три таблицы tblFactorDefinition, tblConstituent и tblFamily:

FamilyID | FieldName  |  FactorDefinition  |  PropertyTypeID
---------+------------+--------------------+----------------
10216    |  Factor1   |  901               |  300
10216    |  Factor2   |  901               |  305
10216    |  Factor3   |  901               |  310


ConstituentID | FamilyID |  ListingID | Factor1 | Factor2 | Factor3 | Factor9
--------------+----------+------------+---------+---------+---------+---------
1101          | 10216    |    1       |  0.1    | NULL    |  0.5    |   1.0
1105          | 10216    |    2       |  0.1    | 0.3     |  0.5    |   1.0
1108          | 10216    |    5       |  0.45   | 0.42    |  NULL   |   1.0


FamilyID | OpenDate
---------+------------
10216    | 2016-05-16

Здесь показан ожидаемый результатниже:

FamilyID  |  FieldName   |  ConstituentID
----------+--------------+---------------
10216     |   Factor2    |  1101
10216     |   Factor3    |  1108

Это запрос, и я не понимаю правильную логику, следовательно, он ничего не возвращает.

SELECT
    T.FamilyID,
    C.COLUMN_NAME,
    T.ConstituentID
FROM 
    SolaDBServer..tblConstituent T
INNER JOIN 
    INFORMATION_SCHEMA.COLUMNS C ON T.FamilyID = C.COLUMN_NAME 
                                 AND C.TABLE_NAME = 'tblFactorDefinition'  
                                 AND T.FamilyID = 10216
LEFT OUTER JOIN 
    SolaDBServer..tblConstituent tc ON tc.FamilyID = T.FamilyID 
INNER JOIN 
    SolaDBServer..tblFamily tf ON tf.FamilyID = tc.FamilyID  
                               AND tf.OpenDate = CAST(GETDATE() AS DATE)
WHERE 
    C.COLUMN_NAME = 'FieldName'

Любая помощь приветствуется с этим?

Спасибо.

1 Ответ

1 голос
/ 17 мая 2019

Вы можете использовать UNPIVOT

Обратите внимание, что я использовал в запросе функцию IIF .(Вам нужна SQL Server 2012 или более поздняя версия)

Если вы используете более старую версию, используйте вместо нее операторы case.

Попробуйте это:

select a.FamilyID,a.FieldName,a.ConstituentID from 
(
select FamilyID,FieldName, ConstituentID, indicator
from 
(select c.ConstituentID,c.FamilyID
,iif(factor1 is null,1,0) as Factor1  --indicator for null
,iif(factor2 is null,1,0) as Factor2
,iif(factor3 is null,1,0) as Factor3
,iif(factor9 is null,1,0) as Factor9
from tblConstituent c
join tblFamily f
on f.FamilyID = c.FamilyID
where f.OpenDate = cast (getdate() as date)
)p
unpivot
(Indicator for FieldName
 in ([Factor1],[Factor2],[Factor3],[Factor9])
 ) as unpvt    
) a
join tblFactorDefinition b  --check if their factor(s) exist for specific ID
on a.FamilyID = b.FamilyID
and a.FieldName = b.FieldName 
where a.Indicator = 1

Результат теста (я добавил еще одну строку с другим FamilyID):

DB <> Fiddle

...