簡體   English   中英

左查詢子查詢與一個結果

[英]left join with subquery with one result

這是一個查詢:

SELECT 
k.[mg_KarId] AS [mg_KarId],
k.[SymKar] AS [SymKar],
k.[OpiKar] AS [OpiKar],
k.[Status] AS [Status],
kmlg.SymLok AS Lok_GLS1,
kmlk.SymLok AS Lok_KRS1,
kmlw.SymLok AS Lok_WLS1

FROM dbo.[mg_vv_Kar_All] AS k WITH (NOLOCK)

LEFT JOIN (
    SELECT kml.SymKar, kml.SymLok
    FROM dbo.mg_KarMagLok kml
    WHERE kml.Mag LIKE 'GLS1' 
    ) kmlg ON k.SymKar = kmlg.SymKar
LEFT JOIN (
    SELECT kml.SymKar, kml.SymLok
    FROM dbo.mg_KarMagLok kml
        WHERE kml.Mag LIKE 'KRS1'
        ) kmlk ON k.SymKar = kmlk.SymKar    
LEFT JOIN (
    SELECT kml.SymKar, kml.SymLok
    FROM dbo.mg_KarMagLok kml
        WHERE kml.Mag LIKE 'WLS1'
        ) kmlw ON k.SymKar = kmlw.SymKar
WHERE k.Status <> 'W'
and k.SymKar = '0006438';

它給我八行-每個左聯接(2 * 2 * 2)中有2行:

2002111576  0006438 CUKIER  A   R03-C-05    S07-A-08    WR03-19-01
2002111576  0006438 CUKIER  A   R03-C-05    S07-A-08    WR04-20-50
2002111576  0006438 CUKIER  A   R03-C-05    S07-A-09    WR03-19-01
2002111576  0006438 CUKIER  A   R03-C-05    S07-A-09    WR04-20-50
2002111576  0006438 CUKIER  A   R04-A-02    S07-A-08    WR03-19-01
2002111576  0006438 CUKIER  A   R04-A-02    S07-A-08    WR04-20-50
2002111576  0006438 CUKIER  A   R04-A-02    S07-A-09    WR03-19-01
2002111576  0006438 CUKIER  A   R04-A-02    S07-A-09    WR04-20-50

我只需要一行-無論哪一行。 我嘗試將LEFT JOIN中的子查詢修改為:

SELECT TOP 1 kml.SymKar, kml.SymLok
    FROM dbo.mg_KarMagLok kml
    WHERE kml.Mag LIKE 'GLS1'

但這在列Lok_GLS1的主查詢中給了我NULL。 我應該如何解決這個問題?

此子查詢:

SELECT TOP 1 kml.SymKar, kml.SymLok
FROM dbo.mg_KarMagLok kml
WHERE kml.Mag LIKE 'GLS1'

返回TOP 1從記錄dbo.mg_KarMagLok 不管其相關性來dbo.[mg_vv_Kar_All]SymKar字段。 因此,最有可能第一個LEFT JOIN失敗,導致kmlg.SymLok (別名Lok_GLS1 )為NULL

如果要在子查詢中使用TOP 1 ,則必須用OUTER APPLY代替LEFT JOIN

OUTER APPLY (
    SELECT TOP 1 kml.SymLok
    FROM dbo.mg_KarMagLok kml
    WHERE kml.Mag LIKE 'GLS1' AND k.SymKar = kmlg.SymKar AND
          kml.SymLok IS NOT NULL       
) kmlg(Lok_GLS1) 
SELECT 
k.[mg_KarId] AS [mg_KarId],
k.[SymKar] AS [SymKar],
k.[OpiKar] AS [OpiKar],
k.[Status] AS [Status],
(
    SELECT TOP 1 kml.SymLok
    FROM dbo.mg_KarMagLok kml
    WHERE kml.Mag LIKE 'GLS1' 
    AND kml ON k.SymKar = kmlg.SymKar
) ,
(
    SELECT TOP 1 kml.SymLok
    FROM dbo.mg_KarMagLok kml
    WHERE kml.Mag LIKE 'KRS1'
    AND k.SymKar = kml.SymKar
) ,
(
    SELECT TOP 1 kml.SymLok
    FROM dbo.mg_KarMagLok kml
    WHERE kml.Mag LIKE 'WLS1'
    AND kmlw ON k.SymKar = kml.SymKar  
) 
FROM dbo.[mg_vv_Kar_All] AS k WITH (NOLOCK)
WHERE k.Status <> 'W'
and k.SymKar = '0006438';

您可以考慮使用子查詢並避免3個聯接

如果您真的不在乎結果集中的最后三列,為什么不這樣做:

SELECT TOP 1
k.[mg_KarId] AS [mg_KarId],
k.[SymKar] AS [SymKar],
k.[OpiKar] AS [OpiKar],
k.[Status] AS [Status]

FROM dbo.[mg_vv_Kar_All] AS k WITH (NOLOCK)
WHERE k.Status <> 'W'
and k.SymKar = '0006438';

如果要解決聚合問題,可以對數據集進行分組。 而不是使用TOP關鍵字,而是編寫如下查詢:

SELECT kml.SymKar, kml.SymLok
FROM dbo.mg_KarMagLok kml
WHERE kml.Mag LIKE 'GLS1'
group by kml.SymKar, kml.SymLok

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM