2015-02-22 4 views
0

Использование 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 
+2

Вы уверены, что не хотите «ПРАВИЛЬНОЙ ВСТРОЕННОЙ РАБОТЫ»? –

+0

@ Jeroen О, за любовь .... Я знал, что должен был выпить кофе, прежде чем публиковать этот вопрос. Спасибо, человек, возможно, спас меня пару часов :) –

+0

Как только вы больше не можете говорить слева направо, это, вероятно, признак того, что вам нужно больше спать, а не кофе. Но что бы ни работало для вас. Надеюсь, что бессонница прояснится. :-) –

ответ

4

Запрос вы ищете можно записать просто как это:

SELECT ComputerName, A.ComputerID, Name, Value FROM BESEXT.COMPUTER A 
CROSS JOIN (SELECT * FROM BESEXT.ANALYSIS_PROPERTY WHERE ID BETWEEN 1672 AND 1674) B 
LEFT JOIN BESEXT.ANALYSIS_PROPERTY_RESULT C ON A.ComputerId = C.ComputerId AND B.ID = C.PropertyId 
ORDER BY ComputerId, Name 

начать получать все комбинации компьютерных собственности вы заботитесь о:

SELECT * FROM BESEXT.COMPUTER A 
CROSS JOIN (SELECT * FROM BESEXT.ANALYSIS_PROPERTY WHERE ID BETWEEN 1672 AND 1674) B 

Это дает свои результаты:

ID ComputerId ComputerName ID Name 
-- ---------- ------------ -- ---- 
1 595640  PO121203866 1672 DisplayName 
2 631459  PO121201739 1672 DisplayName 
3 1101805  PO121201100 1672 DisplayName 
1 595640  PO121203866 1673 SequenceName 
2 631459  PO121201739 1673 SequenceName 
3 1101805  PO121201100 1673 SequenceName 
1 595640  PO121203866 1674 SequenceVersion 
2 631459  PO121201739 1674 SequenceVersion 
3 1101805  PO121201100 1674 SequenceVersion 

Оттуда вы просто выполните левое соединение на BESEXT.ANALYSIS_PROPERTY_RESULT, чтобы получить свои значения, и вы указываете предложение ORDER BY, чтобы отсортировать его.

+0

Спасибо! Престижность для решения моей маленькой PS там;) –

1

Вы можете сделать это с помощью перекрестного соединения, чтобы установить свойства для всех компьютеров, а затем левое соединение для подключения к фактическим значениям свойств для тех компьютеров, которые установили значения:

SELECT * FROM (
    SELECT 
     C.ComputerName, 
     C.ComputerID, 
     AP.Name, 
     AP.ID 
    FROM BESEXT.COMPUTER C 
    CROSS JOIN BESEXT.ANALYSIS_PROPERTY AP 
    WHERE AP.ID IN (1672, 1673, 1674) 
) AP 
LEFT JOIN BESEXT.ANALYSIS_PROPERTY_RESULT AR 
ON AP.ComputerID = AR.ComputerID AND AP.ID = AR.PropertyID 
ORDER BY AP.ComputerName DESC, AP.Name 
+0

Извините, пришлось принять ответ Тима ниже. Кажется, он ответил за минуту до тебя. Тем не менее, спасибо! Cross join получает меня каждый раз :) –

+0

@RobinMattheussen Ответ Тима был в любом случае лучше :) Я слишком быстро усложнил мой по какой-либо очевидной причине (кроме того, что недостаточно работал над ним). – jpw

0

Как LOJ это было бы так?

SELECT 
    R.ComputerName, 
    C.ComputerID, 
    C.Name, 
    C.Value 
FROM BESEXT.COMPUTER R 
-- LEFT OUTER JOIN ADDED HERE! 
LEFT OUTER JOIN 
(
    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) 
) C 
    ON C.ComputerID = R.ComputerID 
ORDER BY C.ComputerID, C.Name 
+1

Да, это так. Может быть, я должен попытаться поспать. Похоже, я не могу думать прямо. –

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