2013-03-15 100 views
0

如果一直在這個查詢一整天,現在我似乎無法得到我的頭。如果也許你可以指點我正確的方向,或告訴我我想找什麼功能,這將意味着很多。 我試過在SQL中查看樞軸,案例,聯盟和組功能,但沒有運氣......但它看起來很簡單從單列中選擇多個值

我從多個表中選擇。 其中一個表格包含一行,其中包含我需要在我的選擇中返回的多個值。

SQL:

(SELECT  ONYAK_SIGMAPRO_Issues.IssueId, 
          ONYAK_SIGMAPRO_ProjectCustomFieldValues.CustomFieldValue AS [Work Ticket], 
          ONYAK_SIGMAPRO_ProjectCustomFieldValues.CustomFieldValue AS [Customer Name], 
          ONYAK_SIGMAPRO_ProjectCustomFieldValues.CustomFieldValue AS [Job Description], 
          ONYAK_SIGMAPRO_ProjectCategories.CategoryName AS [Printer], 
          ONYAK_SIGMAPRO_Issues.IssueTitle AS [Task Description], 
       ONYAK_SIGMAPRO_Issues.Progress, 
          ONYAK_SIGMAPRO_ProjectStatus.StatusName AS [Status], 
          ONYAK_SIGMAPRO_ProjectPriorities.PriorityName AS [Priority], 
       ONYAK_SIGMAPRO_Issues.DateDue 
FROM   (ONYAK_SIGMAPRO_Issues INNER JOIN 
         ONYAK_SIGMAPRO_ProjectCustomFieldValues ON ONYAK_SIGMAPRO_Issues.IssueId = ONYAK_SIGMAPRO_ProjectCustomFieldValues.IssueId INNER JOIN 
         ONYAK_SIGMAPRO_ProjectCustomFields ON 
         ONYAK_SIGMAPRO_ProjectCustomFieldValues.CustomFieldId = ONYAK_SIGMAPRO_ProjectCustomFields.CustomFieldId AND 
         ONYAK_SIGMAPRO_Issues.ProjectId = ONYAK_SIGMAPRO_ProjectCustomFields.ProjectId INNER JOIN 
         ONYAK_SIGMAPRO_ProjectStatus ON ONYAK_SIGMAPRO_Issues.ProjectId = ONYAK_SIGMAPRO_ProjectStatus.ProjectId AND 
         ONYAK_SIGMAPRO_Issues.IssueStatusId = ONYAK_SIGMAPRO_ProjectStatus.StatusId INNER JOIN 
         ONYAK_SIGMAPRO_ProjectPriorities ON ONYAK_SIGMAPRO_Issues.ProjectId = ONYAK_SIGMAPRO_ProjectPriorities.ProjectId AND 
         ONYAK_SIGMAPRO_Issues.IssuePriorityId = ONYAK_SIGMAPRO_ProjectPriorities.PriorityId INNER JOIN 
         ONYAK_SIGMAPRO_ProjectCategories ON ONYAK_SIGMAPRO_Issues.ProjectId = ONYAK_SIGMAPRO_ProjectCategories.ProjectId AND 
         ONYAK_SIGMAPRO_Issues.IssueCategoryId = ONYAK_SIGMAPRO_ProjectCategories.CategoryId 
             ) 
WHERE  ONYAK_SIGMAPRO_Issues.ProjectId = 2 
AND ONYAK_SIGMAPRO_ProjectCustomFields.CustomFieldId = 1 

UNION all 

SELECT  ONYAK_SIGMAPRO_Issues.IssueId, 
          ONYAK_SIGMAPRO_ProjectCustomFieldValues.CustomFieldValue AS [Work Ticket], 
          ONYAK_SIGMAPRO_ProjectCustomFieldValues.CustomFieldValue AS [Customer Name], 
          ONYAK_SIGMAPRO_ProjectCustomFieldValues.CustomFieldValue AS [Job Description], 
          ONYAK_SIGMAPRO_ProjectCategories.CategoryName AS [Printer], 
          ONYAK_SIGMAPRO_Issues.IssueTitle AS [Task Description], 
       ONYAK_SIGMAPRO_Issues.Progress, 
          ONYAK_SIGMAPRO_ProjectStatus.StatusName AS [Status], 
          ONYAK_SIGMAPRO_ProjectPriorities.PriorityName AS [Priority], 
       ONYAK_SIGMAPRO_Issues.DateDue 
FROM   ONYAK_SIGMAPRO_Issues INNER JOIN 
         ONYAK_SIGMAPRO_ProjectCustomFieldValues ON ONYAK_SIGMAPRO_Issues.IssueId = ONYAK_SIGMAPRO_ProjectCustomFieldValues.IssueId INNER JOIN 
         ONYAK_SIGMAPRO_ProjectCustomFields ON 
         ONYAK_SIGMAPRO_ProjectCustomFieldValues.CustomFieldId = ONYAK_SIGMAPRO_ProjectCustomFields.CustomFieldId AND 
         ONYAK_SIGMAPRO_Issues.ProjectId = ONYAK_SIGMAPRO_ProjectCustomFields.ProjectId INNER JOIN 
         ONYAK_SIGMAPRO_ProjectStatus ON ONYAK_SIGMAPRO_Issues.ProjectId = ONYAK_SIGMAPRO_ProjectStatus.ProjectId AND 
         ONYAK_SIGMAPRO_Issues.IssueStatusId = ONYAK_SIGMAPRO_ProjectStatus.StatusId INNER JOIN 
         ONYAK_SIGMAPRO_ProjectPriorities ON ONYAK_SIGMAPRO_Issues.ProjectId = ONYAK_SIGMAPRO_ProjectPriorities.ProjectId AND 
         ONYAK_SIGMAPRO_Issues.IssuePriorityId = ONYAK_SIGMAPRO_ProjectPriorities.PriorityId INNER JOIN 
         ONYAK_SIGMAPRO_ProjectCategories ON ONYAK_SIGMAPRO_Issues.ProjectId = ONYAK_SIGMAPRO_ProjectCategories.ProjectId AND 
         ONYAK_SIGMAPRO_Issues.IssueCategoryId = ONYAK_SIGMAPRO_ProjectCategories.CategoryId 
WHERE  ONYAK_SIGMAPRO_Issues.ProjectId = 2 
AND ONYAK_SIGMAPRO_ProjectCustomFields.CustomFieldId = 4 

UNION all 

SELECT  ONYAK_SIGMAPRO_Issues.IssueId, 
          ONYAK_SIGMAPRO_ProjectCustomFieldValues.CustomFieldValue AS [Work Ticket], 
          ONYAK_SIGMAPRO_ProjectCustomFieldValues.CustomFieldValue AS [Customer Name], 
          ONYAK_SIGMAPRO_ProjectCustomFieldValues.CustomFieldValue AS [Job Description], 
          ONYAK_SIGMAPRO_ProjectCategories.CategoryName AS [Printer], 
          ONYAK_SIGMAPRO_Issues.IssueTitle AS [Task Description], 
       ONYAK_SIGMAPRO_Issues.Progress, 
          ONYAK_SIGMAPRO_ProjectStatus.StatusName AS [Status], 
          ONYAK_SIGMAPRO_ProjectPriorities.PriorityName AS [Priority], 
       ONYAK_SIGMAPRO_Issues.DateDue 
FROM   ONYAK_SIGMAPRO_Issues INNER JOIN 
         ONYAK_SIGMAPRO_ProjectCustomFieldValues ON ONYAK_SIGMAPRO_Issues.IssueId = ONYAK_SIGMAPRO_ProjectCustomFieldValues.IssueId INNER JOIN 
         ONYAK_SIGMAPRO_ProjectCustomFields ON 
         ONYAK_SIGMAPRO_ProjectCustomFieldValues.CustomFieldId = ONYAK_SIGMAPRO_ProjectCustomFields.CustomFieldId AND 
         ONYAK_SIGMAPRO_Issues.ProjectId = ONYAK_SIGMAPRO_ProjectCustomFields.ProjectId INNER JOIN 
         ONYAK_SIGMAPRO_ProjectStatus ON ONYAK_SIGMAPRO_Issues.ProjectId = ONYAK_SIGMAPRO_ProjectStatus.ProjectId AND 
         ONYAK_SIGMAPRO_Issues.IssueStatusId = ONYAK_SIGMAPRO_ProjectStatus.StatusId INNER JOIN 
         ONYAK_SIGMAPRO_ProjectPriorities ON ONYAK_SIGMAPRO_Issues.ProjectId = ONYAK_SIGMAPRO_ProjectPriorities.ProjectId AND 
         ONYAK_SIGMAPRO_Issues.IssuePriorityId = ONYAK_SIGMAPRO_ProjectPriorities.PriorityId INNER JOIN 
         ONYAK_SIGMAPRO_ProjectCategories ON ONYAK_SIGMAPRO_Issues.ProjectId = ONYAK_SIGMAPRO_ProjectCategories.ProjectId AND 
         ONYAK_SIGMAPRO_Issues.IssueCategoryId = ONYAK_SIGMAPRO_ProjectCategories.CategoryId 
WHERE  ONYAK_SIGMAPRO_Issues.ProjectId = 2 
AND ONYAK_SIGMAPRO_ProjectCustomFields.CustomFieldId = 9) 
ORDER BY ONYAK_SIGMAPRO_Issues.IssueId 

結果:

 
IssueId Work Ticket Customer Name Job Description Printer Task Description Progress Status Priority DateDue 
1070 8828 8828 8828 Heidelberg brochure 0 Art Work High 00:00.0 
1070 brochures brochures brochures Heidelberg brochure 0 Art Work High 00:00.0 
1070 Liberty Life Liberty Life Liberty Life Heidelberg brochure 0 Art Work High 00:00.0 
1082 Liberty Life Liberty Life Liberty Life Heidelberg (brochures 0 Art Work High 00:00.0 
1082 brochures brochures brochures Heidelberg (brochures 0 Art Work High 00:00.0 
1082 8294 8294 8294 Heidelberg (brochures 0 Art Work High 00:00.0 
1086 8295 8295 8295 Heidelberg (brochures 0 Art Work High 00:00.0 
1086 stable growth brochures  stable growth brochures  stable growth brochures  Heidelberg (brochures 0 Art Work High 00:00.0 
1086 Liberty Life Liberty Life Liberty Life Heidelberg (brochures 0 Art Work High 00:00.0 
1090 Liberty Life Liberty Life Liberty Life Kamori (VAS Card 0 Art Work High 00:00.0 
1090 VAS cards VAS cards VAS cards Kamori (VAS Card 0 Art Work High 00:00.0 
1090 8296 8296 8296 Kamori (VAS Card 0 Art Work High 00:00.0 
1104 8300 8300 8300 Heidelberg Menu text 0 Art Work High 00:00.0 
1104 menu text menu text menu text Heidelberg Menu text 0 Art Work High 00:00.0 
1104 South African Airways South African Airways South African Airways Heidelberg Menu text 0 Art Work High 00:00.0 

大膽列是給我找麻煩。

我想選擇做返回如下:

 
IssueId Work Ticket Customer Name Job Description Printer Task Description Progress Status Priority DateDue 
1070 8828 Liberty Life brochures Heidelberg brochure 0 Art Work High 00:00.0 
1082 8294 8294 brochures Heidelberg (brochures 0 Art Work High 00:00.0 
1086 8295 Liberty Life Liberty Life Heidelberg (brochures 0 Art Work High 00:00.0 
1090 8296 Liberty Life VAS cards Kamori (VAS Card 0 Art Work High 00:00.0 
1104 8300 South African Airways menu text Heidelberg Menu text 0 Art Work High 00:00.0 

我可以使用哪些功能或類型的選擇?

+2

您的SQL,你的結果是解決此問題既非常大,也不可讀。你可以發佈一個簡單的例子,或者更簡潔地解釋你想要做什麼。您的描述表明您希望基於表中的單個列返回結果中的兩個值 - 是否正確? – 2013-03-15 10:37:43

+0

對於您的結果...如果您發佈屏幕截圖而不是所有文本,它可能會更清晰。另外,對於查詢部分..可以刪除查詢中沒有必要的任何連接/列?這將幫助我們專注於這個問題。 – Matt 2013-03-15 10:42:15

+0

你需要通過IssueId在最後完成一個組,所有三個工單,客戶名稱,職位描述是相同的。CustomFieldValue – 2013-03-15 10:58:13

回答

0

我還在研究它,但我要說的第一件事情在這裏很有用,你不需要在這種情況下繼續使用UNION ALL(除非我錯過了某件事)......只是使用一個SELECT查詢(無工會),改變WHERE子句看起來像這樣:

WHERE ONYAK_SIGMAPRO_Issues.ProjectId = 2 
AND ONYAK_SIGMAPRO_ProjectCustomFields.CustomFieldId IN (1,4,9) 

首先嚐試一下,看看你會得到什麼......然後告訴我們

編輯

基於您在給定鏈接上發佈的屏幕截圖(whi ch使問題更容易看到),我可以看到您需要使用DISTINCT關鍵字。基本上:選擇DISTINCT等...

+0

Thx的回覆馬特,你是正確的使用IN函數。此查詢返回與UNION ALL查詢相同的結果。 – Heinrich 2013-03-18 09:19:29

+0

@ user2173521不客氣。你有沒有進一步的運氣呢?這種問題對我們來說很難,只是從帖子中給出的信息中解決。我的建議是,你發現有人擅長使用SQL,可以坐在你旁邊並親自工作。 – Matt 2013-03-18 10:30:24

+0

嗨馬特,我確實使用了我可以找到的所有資源,但仍然沒有運氣。我是否需要提供更多信息以幫助您?我無法添加圖像stackoferflow其他明智我可能能夠爲您提供一個更清晰的視圖我的問題?! – Heinrich 2013-03-19 10:00:17

0

@Matt簡單地使用DISTINCT返回與以前相同的結果。這是因爲我從我選擇的「IssueId」不同的表中選擇了3次「CustomFieldId」列。但是當我在select中使用子查詢時,我得到了我想要的結果。

SELECT DISTINCT(ONYAK_SIGMAPRO_Issues.IssueId), 
    (SELECT ONYAK_SIGMAPRO_ProjectCustomFieldValues.CustomFieldValue 
    FROM ONYAK_SIGMAPRO_ProjectCustomFieldValues INNER JOIN 
     ONYAK_SIGMAPRO_Issues ON ONYAK_SIGMAPRO_ProjectCustomFieldValues.IssueId = ONYAK_SIGMAPRO_Issues.IssueId INNER JOIN 
     ONYAK_SIGMAPRO_ProjectCustomFields ON 
     ONYAK_SIGMAPRO_ProjectCustomFieldValues.CustomFieldId = ONYAK_SIGMAPRO_ProjectCustomFields.CustomFieldId 
      WHERE (ONYAK_SIGMAPRO_Issues.ProjectId = 2) AND (ONYAK_SIGMAPRO_ProjectCustomFields.CustomFieldId = 1) AND ONYAK_SIGMAPRO_Issues.IssueId = 1070) AS [Work Ticket], 
    (SELECT ONYAK_SIGMAPRO_ProjectCustomFieldValues.CustomFieldValue 
    FROM ONYAK_SIGMAPRO_ProjectCustomFieldValues INNER JOIN 
     ONYAK_SIGMAPRO_Issues ON ONYAK_SIGMAPRO_ProjectCustomFieldValues.IssueId = ONYAK_SIGMAPRO_Issues.IssueId INNER JOIN 
     ONYAK_SIGMAPRO_ProjectCustomFields ON 
     ONYAK_SIGMAPRO_ProjectCustomFieldValues.CustomFieldId = ONYAK_SIGMAPRO_ProjectCustomFields.CustomFieldId 
      WHERE (ONYAK_SIGMAPRO_Issues.ProjectId = 2) AND (ONYAK_SIGMAPRO_ProjectCustomFields.CustomFieldId = 4) AND ONYAK_SIGMAPRO_Issues.IssueId = 1070) AS [Customer Name], 
    (SELECT ONYAK_SIGMAPRO_ProjectCustomFieldValues.CustomFieldValue 
    FROM ONYAK_SIGMAPRO_ProjectCustomFieldValues INNER JOIN 
     ONYAK_SIGMAPRO_Issues ON ONYAK_SIGMAPRO_ProjectCustomFieldValues.IssueId = ONYAK_SIGMAPRO_Issues.IssueId INNER JOIN 
     ONYAK_SIGMAPRO_ProjectCustomFields ON 
     ONYAK_SIGMAPRO_ProjectCustomFieldValues.CustomFieldId = ONYAK_SIGMAPRO_ProjectCustomFields.CustomFieldId 
      WHERE (ONYAK_SIGMAPRO_Issues.ProjectId = 2) AND (ONYAK_SIGMAPRO_ProjectCustomFields.CustomFieldId = 9) AND ONYAK_SIGMAPRO_Issues.IssueId = 1070) AS [Job Description], 
    ONYAK_SIGMAPRO_ProjectCategories.CategoryName AS [Printer], 
    ONYAK_SIGMAPRO_Issues.IssueTitle AS [Task Description], 
    ONYAK_SIGMAPRO_Issues.Progress, 
    ONYAK_SIGMAPRO_ProjectStatus.StatusName AS [Status], 
    ONYAK_SIGMAPRO_ProjectPriorities.PriorityName AS [Priority], 
    ONYAK_SIGMAPRO_Issues.DateDue 
     FROM ONYAK_SIGMAPRO_Issues INNER JOIN 
     ONYAK_SIGMAPRO_ProjectCustomFieldValues ON 
     ONYAK_SIGMAPRO_Issues.IssueId = ONYAK_SIGMAPRO_ProjectCustomFieldValues.IssueId INNER JOIN 
     ONYAK_SIGMAPRO_ProjectCustomFields ON 
     ONYAK_SIGMAPRO_ProjectCustomFieldValues.CustomFieldId = ONYAK_SIGMAPRO_ProjectCustomFields.CustomFieldId AND 
     ONYAK_SIGMAPRO_Issues.ProjectId = ONYAK_SIGMAPRO_ProjectCustomFields.ProjectId INNER JOIN 
     ONYAK_SIGMAPRO_ProjectStatus ON 
     ONYAK_SIGMAPRO_Issues.ProjectId = ONYAK_SIGMAPRO_ProjectStatus.ProjectId AND 
     ONYAK_SIGMAPRO_Issues.IssueStatusId = ONYAK_SIGMAPRO_ProjectStatus.StatusId INNER JOIN 
     ONYAK_SIGMAPRO_ProjectPriorities ON 
     ONYAK_SIGMAPRO_Issues.ProjectId = ONYAK_SIGMAPRO_ProjectPriorities.ProjectId AND 
     ONYAK_SIGMAPRO_Issues.IssuePriorityId = ONYAK_SIGMAPRO_ProjectPriorities.PriorityId INNER JOIN 
     ONYAK_SIGMAPRO_ProjectCategories ON 
     ONYAK_SIGMAPRO_Issues.ProjectId = ONYAK_SIGMAPRO_ProjectCategories.ProjectId AND 
     ONYAK_SIGMAPRO_Issues.IssueCategoryId = ONYAK_SIGMAPRO_ProjectCategories.CategoryId 
      WHERE ONYAK_SIGMAPRO_Issues.ProjectId = 2 
      AND ONYAK_SIGMAPRO_Issues.IssueId = 1070 

如何我需要顯示所有數據,而不僅僅是一個ID。

我也選擇了「CustomFieldId」分爲3個不同的臨時表,然後用最後的選擇我將所有的表...這回正是我想要的:)