Использование SQL Server 2012 (LocalDB), у меня есть три таблицы:Левое внешнее соединение в SQL Server 2012 LocalDB не работает?
BESEXT.COMPUTER
BESEXT.ANALYSIS_PROPERTY
BESEXT.ANALYSIS_PROPERTY_RESULT
Это содержит следующую информацию:
- BESEXT.COMPUTER: Отображение между ComputerIDs и ComputerNames
- BESEXT.ANALYSIS_PROPERTY: Список свойств, которые могут быть сопоставлены с компьютером
- BESEXT.ANALYSIS_PROPERTY_RESULT: список значений свойств для компьютера
Во-первых, я выполнить следующий запрос:
SELECT
AR.ComputerID,
AP.Name,
AR.Value
FROM BESEXT.ANALYSIS_PROPERTY_RESULT AR
JOIN BESEXT.ANALYSIS_PROPERTY AP ON AP.ID = AR.PropertyID
AND AP.ID IN (1672, 1673, 1674)
ORDER BY AR.ComputerID, AP.Name
что дает следующий результат:
ComputerID Name Value
---------- ---- -----
595640 DisplayName Windows 8.1 x64 - Mobile Device Image - v3.2
595640 SequenceName Windows 8.1 x64 - Mobile Device Image
595640 SequenceVersion 3.2
631459 DisplayName Windows 8.1 x64 - Mobile Device Image - v3.2
631459 SequenceName Windows 8.1 x64 - Mobile Device Image
631459 SequenceVersion 3.2
В BESEXT.COMPUTER я имеют следующие значения:
ID ComputerID ComputerName
-- ---------- ------------
1 595640 PO121203866
2 631459 PO121201739
3 1101805 PO121201100
I хотите выполнить левое внешнее соединение всех моих объектов компьютера при первом выборе, чтобы я знал, на каких компьютерах у меня нет ценности e для.
Итак, первый я просто внутреннее соединение по предыдущему выбору:
SELECT
C.ComputerName,
R.ComputerID,
R.Name,
R.Value
FROM (
SELECT
AR.ComputerID,
AP.Name,
AR.Value
FROM BESEXT.ANALYSIS_PROPERTY_RESULT AR
JOIN BESEXT.ANALYSIS_PROPERTY AP ON AP.ID = AR.PropertyID
AND AP.ID IN (1672, 1673, 1674)
) R
JOIN BESEXT.COMPUTER C ON C.ComputerID = R.ComputerID
ORDER BY R.ComputerID, R.Name
Который, как и ожидалось, дает следующий набор результатов:
ComputerName ComputerID Name Value
------------ ---------- ---- -----
PO121203866 595640 DisplayName Windows 8.1 x64 - Mobile Device Image - v3.2
PO121203866 595640 SequenceName Windows 8.1 x64 - Mobile Device Image
PO121203866 595640 SequenceVersion 3.2
PO121201739 631459 DisplayName Windows 8.1 x64 - Mobile Device Image - v3.2
PO121201739 631459 SequenceName Windows 8.1 x64 - Mobile Device Image
PO121201739 631459 SequenceVersion 3.2
Теперь для большого финала, давайте сделаем LEFT OUTER JOIN:
SELECT
C.ComputerName,
R.ComputerID,
R.Name,
R.Value
FROM (
SELECT
AR.ComputerID,
AP.Name,
AR.Value
FROM BESEXT.ANALYSIS_PROPERTY_RESULT AR
JOIN BESEXT.ANALYSIS_PROPERTY AP ON AP.ID = AR.PropertyID
AND AP.ID IN (1672, 1673, 1674)
) R
-- LEFT OUTER JOIN ADDED HERE!
LEFT OUTER JOIN BESEXT.COMPUTER C ON C.ComputerID = R.ComputerID
ORDER BY R.ComputerID, R.Name
Т его доходность тот же самый набор результатов, что и с внутренним соединением!
Это не то, что я ищу, и это совсем не то, чего я ожидал. Сейчас довольно поздно, и я в основном делаю некоторые работы из бессонницы, но я думаю, что это примерно так же просто и пример Outer Join, как он может получить, не так ли? Результат, который я хочу достичь с помощью внешнего соединения, таков:
ComputerName ComputerID Name Value
PO121203866 595640 DisplayName Windows 8.1 x64 - Mobile Device Image - v3.2
PO121203866 595640 SequenceName Windows 8.1 x64 - Mobile Device Image
PO121203866 595640 SequenceVersion 3.2
PO121201739 631459 DisplayName Windows 8.1 x64 - Mobile Device Image - v3.2
PO121201739 631459 SequenceName Windows 8.1 x64 - Mobile Device Image
PO121201739 631459 SequenceVersion 3.2
PO121201100 NULL NULL NULL
PO121201100 NULL NULL NULL
PO121201100 NULL NULL NULL
P.S.Чтобы быть полностью честным, результат я ищу больше походит на это, но я чувствую, что был бы другой вопрос в целом:
ComputerName Name Value
------------ ---- -----
PO121203866 DisplayName Windows 8.1 x64 - Mobile Device Image - v3.2
PO121203866 SequenceName Windows 8.1 x64 - Mobile Device Image
PO121203866 SequenceVersion 3.2
PO121201739 DisplayName Windows 8.1 x64 - Mobile Device Image - v3.2
PO121201739 SequenceName Windows 8.1 x64 - Mobile Device Image
PO121201739 SequenceVersion 3.2
PO121201100 DisplayName NULL
PO121201100 SequenceName NULL
PO121201100 SequenceVersion NULL
Вы уверены, что не хотите «ПРАВИЛЬНОЙ ВСТРОЕННОЙ РАБОТЫ»? –
@ Jeroen О, за любовь .... Я знал, что должен был выпить кофе, прежде чем публиковать этот вопрос. Спасибо, человек, возможно, спас меня пару часов :) –
Как только вы больше не можете говорить слева направо, это, вероятно, признак того, что вам нужно больше спать, а не кофе. Но что бы ни работало для вас. Надеюсь, что бессонница прояснится. :-) –