2014-07-07 60 views
0

最初,讓我描述一下我希望查詢返回的內容。我希望此查詢返回AddressType表中AddressTypeLookupID爲3或5的所有記錄,這是AddressType表中設置的。其次,作爲進一步的限制,這還必須僅包括具有IndustryTypeID = 56的公司,該公司在IndustryType表中設置。 Address,AddressType和IndustryType表中的所有記錄都按ID鏈接。SQL查詢根據3個不同的表執行INNER JOIN

SELECT B.AddressTypeLookupID, A.Address1, A.Address2, A.City, A.State, A.Zip, A.ID 
FROM Company.dbo.Address A 
INNER JOIN Company.dbo.AddressType B ON A.AddressID = B.AddressID 
WHERE B.Status = 'Active' AND 
     B.AddressTypeLookupID = 3 AND 
     A.AddressID = (SELECT MAX(Z.AddressID) 
        FROM Company.dbo.Address Z 
         INNER JOIN Company.dbo.AddressType X ON Z.AddressID = X.AddressID 
        WHERE B.Status = 'Active' 
         AND B.AddressTypeLookupID = 3 
         AND Z.ID = A.ID 
        ) 
INNER JOIN COMPANY.dbo.IndustryTypeCompanyName g ON g.ID = A.ID 
WHERE g.IndustryTypeID = 56 

UNION ALL 

SELECT B.AddressTypeLookupID, A.Address1, A.Address2, A.City, A.State, A.Zip, A.ID 
FROM Company.dbo.Address A 
INNER JOIN Company.dbo.AddressType B ON A.AddressID = B.AddressID 
WHERE B.Status = 'Active' AND 
     B.AddressTypeLookupID = 5 AND 
     A.AddressID = (SELECT MAX(Z.AddressID) 
        FROM Company.dbo.Address Z 
        INNER JOIN Company.dbo.AddressType X ON Z.AddressID = X.AddressID 
        WHERE B.Status = 'Active' AND 
         B.AddressTypeLookupID = 5 AND 
         Z.ID = A.ID       
       ) 
INNER JOIN COMPANY.dbo.IndustryTypeCompanyName j ON j.ID = A.ID 
WHERE j.IndustryTypeID = 56 

我的問題是,我相信,隨着內部聯接稱爲「G」和上述「J」,在那裏我嘗試IndustryTypeID = 56限制查詢。查詢正常工作(根據需要)沒有這些行。我只是無法將IndustryTypeID的(完整)查詢限制爲56.我無論在邏輯上是錯誤的,或者我根本就不理解SQL語法。我使用的是Microsoft SQL Management Studio中2008

+0

什麼是不工作?你沒有得到當前查詢的行嗎?您確定有任何地址的IndustryTypeId爲56嗎? – Vulcronos

+0

對不起,應該提到:我實際上得到一個語法錯誤:「INNER附近的語法錯誤」。有幫助,不是嗎。但是我們知道它來自'g'或'j'連接子句,因爲它沒有這些條件就可以正常工作。 – Musicode

+0

刪除該子查詢以確定會嚴重影響性能的「AddressID」。只是聲明一個變量Set @variable =「query」,然後'A.AddressID = @ variable' – CSharper

回答

1

我不知道什麼是最後一個加入的解釋是:,但據我可以告訴你的查詢可以簡化爲:

SELECT B.AddressTypeLookupID, A.Address1, A.Address2, A.City, A.State, A.Zip, A.ID 
FROM Company.dbo.Address A 
JOIN Company.dbo.AddressType B 
    ON A.AddressID = B.AddressID 
JOIN COMPANY.dbo.IndustryTypeCompanyName g 
    ON g.ID = A.ID 
WHERE B.Status = 'Active' 
    AND B.AddressTypeLookupID in (3,5) 
    AND A.AddressID = (SELECT MAX(Z.AddressID) 
         FROM Company.dbo.Address Z 
         JOIN Company.dbo.AddressType X 
          ON Z.AddressID = X.AddressID 
         WHERE 
         -- redundant predicates removed 
         -- B.Status = 'Active' 
         -- AND B.AddressTypeLookupID = 3 
         -- AND 
          Z.ID = A.ID 
        )   
    AND g.IndustryTypeID = 56 
1

我見現在我們知道這是一個語法錯誤的問題。你有一個內部連接,一個位置,然後是另一個內部連接,然後是另一個內部連接。每個組只能按請求順序發生一次,但您可以多次使用關鍵字連接。所以選擇,從,加入,加入在哪裏。

SELECT B.AddressTypeLookupID, A.Address1, A.Address2, A.City, A.State, A.Zip, A.ID 
FROM Company.dbo.Address A 
INNER JOIN Company.dbo.AddressType B 
ON A.AddressID = B.AddressID 
INNER JOIN COMPANY.dbo.IndustryTypeCompanyName g 
ON g.ID     = A.ID 
WHERE B.Status   = 'Active' 
AND B.AddressTypeLookupID = 3 
AND A.AddressID   = 
    (SELECT MAX(Z.AddressID) 
    FROM Company.dbo.Address Z 
    INNER JOIN Company.dbo.AddressType X 
    ON Z.AddressID   = X.AddressID 
    WHERE B.Status   = 'Active' 
    AND B.AddressTypeLookupID = 3 
    AND Z.ID     = A.ID 
) 
AND g.IndustryTypeID = 56 
1

既然你已經有包括在選擇地址表,而不是選擇最多會更容易,只需使用ROW_NUMBER()爲您解決1每組問題

With cte as 
(
    SELECT B.addresstypelookupid, 
      A.address1, 
      A.address2, 
      A.city, 
      A.state, 
      A.zip, 
      A.id , 
      ROW_NUMBER() OVER (Partition BY b.addresstypelookupid 
           order by addressid desc ) rn 
    FROM company.dbo.address A 
      INNER JOIN company.dbo.addresstype B 
        ON A.addressid = B.addressid 
         AND B.addresstypelookupid IN (3, 5) 
         AND B.status = 'Active' 
      INNER JOIN company.dbo.industrytypecompanyname g 
        ON g.id = A.id 
    WHERE g.industrytypeid = 56 
) 
SELECT * FROM CTE WHERE Rn = 1