2017-01-03 2 views
-1

Мне нужно объединить, как показано ниже, но я хочу сделать это только в том случае, если таблица dbo.Problem имеет значение 1 в столбце IsValid. dbo.Problem связана с dbo.delivery от dbo.Problem.ID = dbo.Delivery.IssueID.Таблица слияния связанной таблицы содержит значение sql


merge [dbo].[Delivery] as D 
using [ReportSvr].[Report].[dbo].[Delivery] as LinkD 

on (D.[ID] = LinkD.[ID]) 
    WHEN NOT MATCHED BY TARGET 
    THEN INSERT(
     [ID] 
     ,[IssueID] 
     ,[column2] 
     ,[column3] 
    ) 
    VALUES(
     [ID] 
     ,[IssueID] 
     ,[column] 
     ,[column] 
    ); 
GO 

ли пытался что-то подобное;

select d.IssueID, i.IsValid 
From Delivery d 
left join (Select* From Issue where IsValid = 1) i 
on d.IssueID = i.ID 

с первого шага должен быть в состоянии запрашиваемых строк.

Выход:

IssueID IsValid 
1  1 
2  NULL 
6  NULL 
7  1 
8  1 
9  1 
10  NULL 

Как вы видите, у меня не очень ....

Я новый (второй день) в SQL, извините, если это простая задача, которую я должен знать около.

Надеюсь, вы в состоянии мне помочь.

+0

Если вы не используете MySQL, то вы должны удалить этот тег. –

+0

Вы использовали/Упомянули разные таблицы в своем вопросе, а затем 'Merge', а затем' select statements'? На каких таблицах вы действительно работаете, и что именно вы пытаетесь сделать? '[dbo]. [Delivery]', '[ReportSvr]. [Report]. [dbo]. [Доставка]', 'dbo.Issue'. Также где находится столбец 'IsValid' в' dbo.Problem' или 'dbo.Issue' –

+0

Извините, если я не был чист. Мне нужно объединить две таблицы, как показано на первом снимке, но я хочу только объединить строку из [ReportSvr]. [Report]. [Dbo]. [Delivery], где значение IsValid = 1 в [ReportSvr]. [ Report]. [Dbo]. [Issue] две таблицы связаны [Delivery]. [IssueID] = [Issue]. [ID]. – Lauge

ответ

0

Использование INNER JOIN будет показывать только доставки, имеющие соответствующую запись в таблице проблем. INNER JOIN будет показывать только записи, где есть совпадение в поле объединения. В вашей попытке вы используете LEFT JOIN, который будет показывать все в левой таблице, [Delivery] («left» имеет смысл, если вы показываете весь запрос в одной строке) и сопоставляя записи в правой таблице, [Issue] ,

SELECT d.IssueID, i.IsValid 
FROM Delivery d 
    INNER JOIN Issue i 
     ON d.IssueID = i.ID 
WHERE i.IsValid = 1 
+0

Не могли бы вы объяснить, почему ваше решение должно работать? –

+0

Извините, я забыл, что вы новичок в этом. Вы, должно быть, скопировали запрос где-то с левым соединением. Вы можете потеряться, когда начнете изучать типы соединений, но, честно говоря, 99% моих запросов связаны с INNER или LEFT, поэтому, как только вы их получите, вы пройдете долгий путь. Кроме того, если он просто говорит «JOIN» без модификатора, это соединение INNER по умолчанию, по крайней мере, на SQL Server. –

+0

Спасибо, что часть работает :) Как применить этот отладочный код в слияние, так что сливаются только потоки со значением IsValid = 1 в связанной таблице проблем? – Lauge

0

Спасибо, что помогли мне, мне удалось решить проблему с помощью Рассела Фокса. Я просто хотел опубликовать ответ.


merge [dbo].[Delivery] as D 

using(
    select d.*, i.IsValid 
    From [ErrorReportSvr].[ErrorReport].[dbo].[Delivery] d 
    inner join (Select* From [ErrorReportSvr].[ErrorReport].[dbo].[Issue] where IsValid = 1) i 
    on d.IssueID = i.ID 
) as LinkD 

on (D.[ID] = LinkD.[ID]) 
WHEN NOT MATCHED BY TARGET 
THEN INSERT(
    [ID] 
    ,[IssueID] 
    ,[column2] 
    ,[column3] 
) 
VALUES(
    [ID] 
    ,[IssueID] 
    ,[column2] 
    ,[column3] 
); 
GO