2016-02-17 3 views
0

Я один мастер стол и 5 таблицы ребенок называетсяСложное регистрации в SQL Server 2008

@POWER_CHILD, @AUDIO_CHILD, @RESISTOR_CHILD, @CAPACITOR_CHILD, @INDUCTOR_CHILD 

мне нужно вытащить данные только тогда, когда есть совпадение с ребенком таблицы, но любой столбец содержать пустые т.е. без каких-либо данных в мастер таблица

Это будет считаться действительным и появится на выходе.

Я сделал Inner Join, но не повезло. Как я могу справиться с пустым, поэтому я решил попросить экспертов.

Просьба не рассматривать в качестве основного фундаментального вопроса. пожалуйста, поделитесь своими мыслями.

DDL:

DECLARE @MASTER TABLE 
(
PowerAmplifierID VARCHAR (50), 
AudioAmplifierID VARCHAR (50), 
ResistorID VARCHAR (50), 
CapacitorID VARCHAR (50), 
InductorID VARCHAR (50), 
Years VARCHAR (50) 
) 

INSERT @MASTER 
    SELECT '24456', '5392','', '2190', '10', '1959' UNION ALL 
    SELECT '24456', '', '',  '8888', '29', '1959' UNION ALL 
    SELECT '30583', '4233', '', '2190', '56', '1959' UNION ALL 
    SELECT '24455', '333333', '','2190','10', '1958' UNION ALL 
    SELECT '696969', '7879', '1xt','5000','29', '2015' UNION ALL 
    SELECT '24456', '5392', '', '2190', '29', '1959' UNION ALL 
    SELECT '24455', '4233', '', '2190', '56', '1959' 

DECLARE @POWER_CHILD TABLE 
(
PowerAmplifierID VARCHAR (50), 
PowerAmplifier VARCHAR (50) 
) 

INSERT @POWER_CHILD 
    SELECT '24456', 'Class A Power Amplifiers' UNION ALL 
    SELECT '24455', 'Class B Power Amplifiers' 

DECLARE @AUDIO_CHILD TABLE 
(
AudioAmplifierID VARCHAR (50), 
AudioAmplifier VARCHAR (50) 
) 

INSERT @AUDIO_CHILD 
    SELECT '5392' ,'Transconductance' UNION ALL 
    SELECT '4233' ,'Transresistance' UNION ALL 
    SELECT '7879', 'Vacuum-tube' 

DECLARE @RESISTOR_CHILD TABLE 
(
ResistorID VARCHAR (50), 
Resistor VARCHAR (50) 
) 

INSERT @RESISTOR_CHILD 
    SELECT '1xt', 'Thick film' UNION ALL 
    SELECT '2xt', 'Metal film' UNION ALL 
    SELECT '3xt', 'Wirewound' 

DECLARE @CAPACITOR_CHILD TABLE 
(
CapacitorID VARCHAR (50), 
Capacitor VARCHAR (50) 
) 

INSERT @CAPACITOR_CHILD 
    SELECT '2190', 'Film' UNION ALL 
    SELECT '3536', 'tantalum' UNION ALL 
    SELECT '9999', 'niobium' 

DECLARE @INDUCTOR_CHILD TABLE 
(
InductorID VARCHAR (50), 
Inductor VARCHAR (50) 
) 

    SELECT '29', 'air core' UNION ALL 
    SELECT '56', 'parasitic' UNION ALL 
    SELECT '35', 'Spiderweb' 

Ожидаемый результат

PowerAmplifierID PowerAmplifier AudioAmplifierID AudioAmplifier ResistorID Resistor CapacitorID Capacitor InductorID Inductor Year 

24456 Class A Power Amplifiers 5392 Transconductance '' '' 2190 Film 29 air core 1959 
24455 Class B Power Amplifiers 4233 Transresistance '' '' 2190 Film 56 parasitic 1959 

Большое спасибо ...

24456 5392  2190 10 1959 -- Invalid InductorID as not available in child table, so remove from output 
24456   8888 29 1959-- Invalid CapacitorID as not available in child table,so remove from output 
30583 4233  2190 56 1959-- Invalid Poweramplifierid as not available in child table, remove from output 
24455 333333  2190 10 1958-- Invalid AudioAmplifierid as not available in child table, remove from output 
696969 7879 1xt 5000 29 2015-- Invalid Poweramplifierid as not available in child table, remove from output 
24456 5392  2190 29 1959 -- all valid id and resistorid is null so treated as valid record 
24455 4233  2190 56 1959 -- all valid id and resistorid is null so treated as valid record 
+0

Где ваш текущий Цюй чень? что вы имеете в виду, когда есть соответствие с ребенком? есть 5 дочерних таблиц, какой? – sagi

+0

Я не понимаю, что это значит: «Мне нужно вытащить данные только тогда, когда есть соответствие с дочерней таблицей, но любой столбец содержит пустую ('') в главной таблице, которая будет считаться действительной и появиться на выходе». Можете ли вы, возможно, получить родного английского докладчика, чтобы помочь вам переписать свой вопрос? –

+0

@sagi: в ожидаемом выходе мы можем видеть данные из всей дочерней таблицы Я попытался использовать Внутреннее соединение, чтобы получить строки, когда значение соответствует, но не получает ожидаемого результата. Должен ли я отправить запрос?, Любезно помочь. – akhrot

ответ

3

Не уверен, что описано около заготовок но возвращающие строки из master и связанные с ними детали (если есть) LEFT JOIN могут быть применены:

SELECT * 
FROM @MASTER m 
LEFT JOIN @POWER_CHILD pc on pc.PowerAmplifierID = m.PowerAmplifierID 
LEFT JOIN @AUDIO_CHILD ac on ac.AudioAmplifierID = m.AudioAmplifierID 
LEFT JOIN @RESISTOR_CHILD rc on rc.ResistorID = m.ResistorID 
LEFT JOIN @CAPACITOR_CHILD cc on cc.CapacitorID = m.CapacitorID 
LEFT JOIN @INDUCTOR_CHILD ic on ic.InductorID = m.InductorID 
WHERE (m.PowerAmplifierID = '' or pc.PowerAmplifierID is not NULL) 
    and (m.AudioAmplifierID = '' or ac.AudioAmplifierID is not NULL) 
    and (m.ResistorID = '' or rc.ResistorID is not NULL) 
    and (m.CapacitorID = '' or cc.CapacitorID is not NULL) 
    and (m.InductorID = '' or ic.InductorID is not NULL) 
+0

Я думаю, что мой вопрос запутан. 1-й: когда идентификаторы совпадают с соответствующим идентификатором дочерней таблицы, тогда извлекаются только записи. 2nd: нет данных вообще в нескольких столбцах главной таблицы, которые я назвал пустым. я должен называть его NULL.Those NULL хороши для отображения на выходе. Надеюсь, сейчас немного ясно. – akhrot

+0

Думаю, я понял. Проверьте предложение WHERE и результат, соответствующий вашему запросу. –

+0

Большое спасибо .... – akhrot

0

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

SELECT m.PowerAmplifierID 
    , COALESCE(p.PowerAmplifier, '') 
    , a.AudioAmplifierID 
    , COALESCE(a.AudioAmplifier, '') 
    , c.CapacitorID 
    , COALESCE(c.Capacitor, '') 
    , i.InductorID 
    , COALESCE(i.Inductor, '') 
    , r.ResistorID 
    , COALESCE(r.Resistor, '') 
    , m.Years 
FROM @MASTER m 
LEFT JOIN @POWER_CHILD p ON m.PowerAmplifierID = p.PowerAmplifierID 
LEFT JOIN @AUDIO_CHILD a ON m.AudioAmplifierID = a.AudioAmplifierID 
LEFT JOIN @CAPACITOR_CHILD c ON m.CapacitorID = c.CapacitorID 
LEFT JOIN @INDUCTOR_CHILD i ON m.InductorID = i.InductorID 
LEFT JOIN @RESISTOR_CHILD r ON m.ResistorID = r.ResistorID 

COALESCE возвращает пустую строку в этом случае, если поле NULL.

+0

Вы правы, мы можем включить туда и ограничить строки. но как я могу заверить, что если нет значения в master (так называемый пустой здесь) те не должны получать фильтр – akhrot

+0

Так вы хотите только те, которые не имеют значения в @RESISTOR_CHILD, но все остальные столбцы? –

+0

Нет. Я объясню. если какой-либо из id мастера совпадает с id дочернего элемента. то эти записи должны быть на выходе +, а если сам идентификатор отсутствует в master. эти записи должны выводиться. – akhrot

1

Heres my sql - Я использую несколько левых объединений и объединяюсь, чтобы заменить нули.

Вы можете добавить предложение where, чтобы удалить полностью непревзойденные строки.

select 
m.PowerAmplifierID , 
Coalesce(pc.PowerAmplifier,'') as PowerAmplifier, 

m.AudioAmplifierID , 
Coalesce(ac.AudioAmplifier,'') as AudioAmplifier, 

m.ResistorID , 
Coalesce(rc.Resistor,'') as Resistor, 

m.CapacitorID , 
Coalesce(cc.Capacitor,'') as Capacitor, 

m.InductorID , 
Coalesce(ic.InductorID,'') as Inductor, 

m.Years 

from @Master m 
left join @Power_Child pc on pc.PowerAmplifierID = m.PowerAmplifierID 
left join @Audio_Child ac on ac.AudioAmplifierID = m.AudioAmplifierID 
left join @RESISTOR_CHILD rc on rc.ResistorID = m.ResistorID 
left join @Capacitor_Child cc on cc.CapacitorID = m.CapacitorID 
left join @Inductor_Child ic on ic.InductorID = m.InductorID 

Чтобы показать только те строки, которые не имеют Недопустимый идентификатор в главной таблице добавить это где положение

where 
    not (((m.PowerAmplifierID is not null) and pc.PowerAmplifierID is null) 
Or ((m.AudioAmplifierID is not null) and ac.AudioAmplifierID is null) 
Or ((m.ResistorID is not null) and rc.ResistorID is null) 
Or ((m.CapacitorID is not null) and cc.CapacitorID is null) 
Or ((m.InductorID is not null) and ic.InductorID is null)) 

, если вы хотите, чтобы показать только те строки, которые действительно имеют недопустимый идентификатор в использовании @master это где пункт

where 
    ((m.PowerAmplifierID is not null) and pc.PowerAmplifierID is null) 
Or ((m.AudioAmplifierID is not null) and ac.AudioAmplifierID is null) 
Or ((m.ResistorID is not null) and rc.ResistorID is null) 
Or ((m.CapacitorID is not null) and cc.CapacitorID is null) 
Or ((m.InductorID is not null) and ic.InductorID is null) 

в наборе данных вы предоставили все строки в @master имеют недопустимый идентификатор

+0

Вы правы, мы можем включить туда и ограничить строки. но как я могу заверить, что если нет значения в master (так называемый пустой здесь) те не должны получать фильтр – akhrot

+0

Извините, но я действительно не уверен, что вы просите здесь - что особенного в двух строках, перечисленных в вашем Ожидаемые результаты? – Twisted

+0

1st Все идентификаторы из главной таблицы, соответствующие их дочерней таблице. 2nd: даже некоторые из резисторидов в главной таблице не имеют значения, чем те строки, которые не исключены из вывода. – akhrot