2014-08-28 60 views
2

我主要是一個演示/邏輯層開發人員,不要亂用SQL,但我有一個問題,並且想知道在SQL中是不可能的因爲它不是一個完整的編程語言。SQL Server根據返回的數據動態地更改SELECT中的WHERE子句

  • 我有一個連有
  • 在另一個表中的CompanyID字段的ContactID,將CompanyID連接到公司名稱
  • 我試圖創建一個返回一個接觸ID,並在SELECT語句獨立專欄,該聯繫人的所有公司的集合(按名稱)。

EG

ContactID - CompanyID - CompanyName 
*********************************** 
1   001   Lol 
1   002   Haha 
1   003   Funny 
2   002   Haha 
2   004   Lmao 

我想回到

ContactID - Companies 
********************* 
1   Lol, Haha, Funny 
2   Haha, Lmao 

我發現在每次與一個使用ContactID這樣做的邏輯:

SELECT x.ContactID, substring(
    (
     SELECT ', '+y.CompanyName AS [text()] 
     FROM TblContactCompany x INNER JOIN TblCompany y ON x.CompanyID = y.CompanyID WHERE x.ContactID = 13963 
     For XML PATH (''), root('MyString'), type 
     ).value('/MyString[1]','varchar(max)') 
     , 3, 1000) 
     [OrgNames] from TblContact x WHERE x.ContactID = 13963 

,你可以看到這裏,我在ContactID 13963中硬編碼,它只需要返回co這個人所關聯的公司。

問題是,當我想要在更大規模的SELECT(在一個完整的ContactID的整個表上)返回這個聚合信息PER ROW時。我想擁有x.ContactID = (this.ContactID)但我不知道如何!

如果失敗了,我可以運行一條語句來返回一個ContactID的列表,然後在同一個StoredProc中運行另一條語句,即LOOPS通過此ContactID的列表(本質上執行第二條語句x次,其中x =沒有ContactID) ?

任何幫助大大讚賞。

回答

4

你想要一個相關子查詢IN條款:

SELECT ct.ContactID, 
     stuff((SELECT ', ' + co.CompanyName AS [text()] 
        FROM TblContactCompany cc INNER JOIN 
         TblCompany co 
         ON cc.CompanyID = co.CompanyID 
        WHERE cc.ContactID = ct.ContactId 
        For XML PATH (''), root('MyString'), type 
      ).value('/MyString[1]', 'varchar(max)'), 
      1, 2, '') 
     [OrgNames] 
from TblContact ct; 

注內部子查詢上的where子句。

我還做了另外兩個變化:

  1. 我改變了表的別名,以更好地代表表名。這使得查詢更易於理解。 (另外,由於您在外部查詢和內部查詢中使用了x,所以別名必須更改。)
  2. 我用stuff()替換了substring(),它完全符合您的要求。
+1

我想我愛你 - 這真是血腥! 工作非常好,讓我真正對學習更復雜的SQL感興趣! – 2014-08-28 11:26:34

1

你可以使用一個表變量來存儲所需的x.ContactID並在WHERE條款使用您的主查詢象下面

WHERE 
... 
x.ContactID IN (SELECT ContactID FROM @YourTableVariable) 
+0

我覺得我已經實現了這個像你說不過現在每行顯示了S同一列eems將所有公司名稱都包含在整個表格中! – 2014-08-28 11:21:36

0

不要循環,否則會出現性能問題(通過摺疊行RBAR進行排序)。相反,請設置基於查詢。

這是未經測試,但應該給你的可能是如何工作的想法:

SELECT 
    x.ContactID, 
    substring(
     (SELECT ', '+y.CompanyName AS [text()] 
     FROM TblContactCompany y 
     WHERE x.CompanyID = y.CompanyID 
     For XML PATH (''), root('MyString'), type).value('/MyString[1]','varchar(max)') 
    , 3, 1000) 
    [OrgNames] 
FROM TblContact x 

而且我有一種感覺,你可以用它代替子CONCAT

+0

漱口不是CONCAT – Ruskin 2014-08-28 11:15:05

1

我想你需要做的是在子查詢中使用獨特的表標識符和與外部表X加入表子查詢:

SELECT x.ContactID, substring(
    (
     SELECT ', '+z.CompanyName AS [text()] 
     FROM TblContactCompany y, TblCompany z WHERE y.CompanyID = z.CompanyID AND y.ContactId = x.ContactId 
     For XML PATH (''), root('MyString'), type 
     ).value('/MyString[1]','varchar(max)') 
     , 3, 1000) 
     [OrgNames] from TblContact x