SQL Server 2012 LocalDB中的左外部联接不工作?

SQL Server 2012 LocalDB中的左外部联接不工作?,sql,sql-server,outer-join,sql-server-2012-localdb,Sql,Sql Server,Outer Join,Sql Server 2012 Localdb,使用SQL Server 2012(LocalDB),我有三个表: BESEXT.COMPUTER BESEXT.ANALYSIS_PROPERTY BESEXT.ANALYSIS_PROPERTY_RESULT 这些文件包含以下信息: 计算机:计算机ID和计算机名称之间的映射 BESEXT.ANALYSIS_属性:可映射到计算机的属性列表 betext.ANALYSIS\u PROPERTY\u RESULT:计算机属性值列表 首先,我执行以下查询: SELECT AR.Comp

使用SQL Server 2012(LocalDB),我有三个表:

BESEXT.COMPUTER
BESEXT.ANALYSIS_PROPERTY
BESEXT.ANALYSIS_PROPERTY_RESULT
这些文件包含以下信息:

  • 计算机:计算机ID和计算机名称之间的映射
  • BESEXT.ANALYSIS_属性:可映射到计算机的属性列表
  • betext.ANALYSIS\u PROPERTY\u 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
我希望在第一次选择时对所有计算机对象执行左外部联接,以便知道哪些计算机没有值

首先,我对上一个选择做一个简单的内部连接:

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
现在,为了大结局,让我们做左外连接:

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
这将产生与内部联接完全相同的结果集

这不是我想要的,也不是我所期望的。现在已经很晚了,我基本上是在做一些关于失眠的工作,但我认为这是一个简单的外部连接的例子,对吗?我希望通过外部联接实现的结果是:

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
旁白:说实话,我想要的结果更像这样,但我觉得这将是一个完全不同的问题:

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

您正在查找的查询可以简单地写为:

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

从这里开始,您只需在
betext.ANALYSIS\u PROPERTY\u RESULT
上执行左联接即可获得您的值,并包含
ORDER BY
子句对其进行排序。

您正在查找的查询可以简单地写为:

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

从这里开始,您只需在
betext.ANALYSIS\u PROPERTY\u RESULT
上执行左连接即可获得您的值,您可以使用
ORDER BY
子句对其进行排序。

您可以使用交叉连接来设置所有计算机的属性,然后使用左连接来连接到已设置值的计算机的实际属性值:

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

可以通过使用交叉连接来设置所有计算机的属性,然后使用左连接来连接到已设置值的计算机的实际属性值:

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

作为一个洛杉矶警察会是这样吗

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

作为一个洛杉矶警察会是这样吗

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

你确定你不想要一个
右外连接吗?@Jeroen-Oh看在爱的份上。。。。我知道我应该在发帖前喝杯咖啡。谢谢你,伙计,可能帮我省了几个小时:)一旦你不能再分辨左右,那可能就是你需要更多睡眠的信号,而不是咖啡。但只要对你有用。希望失眠能消除。:-)你确定你不想要一个
右外连接吗?@Jeroen-Oh看在爱的份上。。。。我知道我应该在发帖前喝杯咖啡。谢谢你,伙计,可能帮我省了几个小时:)一旦你不能再分辨左右,那可能就是你需要更多睡眠的信号,而不是咖啡。但只要对你有用。希望失眠能消除。:-)非常感谢。我在那里解决了我的小问题,这是我的荣幸;)非常感谢。我在那里解决了我的小问题,这是我的荣幸;)对不起,我不得不接受蒂姆下面的回答。好像他比你早一分钟回答了。不过,谢谢你!Cross join每次都让我着迷:)@RobinMattheussen Tim的答案更好:)我没有任何明显的原因(除了没有完成它之外)把我的答案复杂化了一点。对不起,我不得不接受Tim下面的答案。好像他比你早一分钟回答了。不过,谢谢你!Cross join每次都让我着迷:)@RobinMattheussen Tim的答案更好:)我没有任何明显的原因(除了没有足够的工作之外)把我的问题复杂化了一点。是的,就是这样。也许我应该试着睡一会儿。看起来我再也不能正常思考了。是的,就是这样。也许我应该试着睡一会儿。看来我再也不能正常思考了。