2013-04-04 130 views
0

我在編寫查詢時遇到了一些麻煩,並想知道是否有人可以提供幫助。我將表格信息簡化到最低限度,試着讓我很容易理解我在做什麼。 我有兩個表A和B. A有一個BId列和一個值字段。 B的信息與問題無關。 我想要做的是返回一組基於任意布爾邏輯的B存在的A,它包含一個BId並匹配某個值。另外,我想返回匹配的值。下面是什麼,我想在我的查詢中幾乎工作示例:MySQL查詢時遇到問題

SELECT * FROM B 
    WHERE 
    (
     (
     EXISTS (
      SELECT a1.Value FROM A as a1 WHERE a1.BId = B.Id AND a1.Value = "X" 
     ) 
     AND EXISTS (
      SELECT a2.Value FROM A as a2 WHERE a2.BId = B.Id AND a2.Value = "Y" 
     ) 
     ) 
     OR EXISTS (
      SELECT a3.Value FROM A as a3 WHERE a3.BId = B.Id AND a3.Value = "Z" 
     ) 
); 

這正是我想要儘可能B的恢復,但是我需要能夠返回相匹配的值。所以如果有一個A的值爲X,另一個A的值爲Y,我會希望a1和a2的值爲X和Y。如果沒有值爲Z的A,則該行將返回NULL。我不確定這樣做的語法或可能性。 我試圖用另一種方法JOIN:

SELECT *, a1.Value, a2.Value FROM B 
    INNER JOIN A AS a1 ON a1.BId = B.Id 
    INNER JOIN A AS a2 on a2.BId = B.Id 
WHERE 
(
    (
    a1.Value = "X" AND a2.Value = "Y" 
) 
    OR 
    (
    a1.Value = "Z" 
) 
); 

這正常返回值,但它只有在X和Y匹配工作。如果Z匹配,由於有兩個JOIN語句來完成第一部分,我得到了重複的結果。出於這個原因,我對使用這種方法持懷疑態度。這樣使用JOIN似乎不太合適。 如果任何人都能理解我想要做的事情,並且指出我會朝着正確的方向發展,那將是非常值得讚賞的。謝謝!

回答

1

您可能已經知道這一點,但我會指出這一點:正如您所說,您的初始SQL查詢工作,但你我需要能夠返回匹配的值。如何實現這一目標沒有普遍的答案,因爲這不是查詢的工作方式。 WHERE EXISTS (SELECT...)語法將不匹配任何行,如果能找到匹配行中的一個或多個,它將返回TRUE。含義:你的數據庫可能有或沒有多個行匹配。

如果我看一個數據庫設計,你的表A似乎有一個指向B創紀錄的外鍵BId,你不提任何唯一的密鑰,所以大部分likeyly,有符合多行至少對於某些值是有條件的。

如果您嘗試使用JOIN實現同樣的功能,首先必須確保您獲得的結果與B中的行數一樣多。 (在我的例子中有10個結果)。通常這是通過使用GROUP BY子句來實現的。我也改變了語法LEFT JOIN的,這樣分組結果將在B返回每條記錄中的一行:

SELECT B.Id, MIN(a1.ID) AS MinA1, MIN(a2.ID) AS MinA2, MIN(a3.ID) as MinA3 FROM B 
LEFT JOIN A AS a1 ON a1.BId = B.Id AND a1.value='X' 
LEFT JOIN A AS a2 on a2.BId = B.Id AND a2.value='Y' 
LEFT JOIN A AS a3 ON a3.BId = B.Id AND a3.value='Z' 
GROUP BY B.Id 

現在最後一部分將消除不匹配結果的條件你條件,這將是:以上

HAVING (MinA1 IS NOT NULL AND MinA2 IS NOT NULL) OR (MinA3) IS NOT NULL 

假定表A有要檢索Id列和所需的最低Id如果不止一行匹配。

+0

哇,這是非常完美的。得到它幾乎沒有修改工作,謝謝! – 2013-04-04 19:56:19