2015-06-07 49 views
0
SELECT DName 
FROM drugs 
WHERE DID IN 
(
    SELECT DID,SID 
    FROM transactions 
    GROUP BY TotalCost 
    HAVING SID = 1 AND TotalCost > 100 
) 

在括號內做這樣的查詢會給我一個結果2列,我需要從其中一個選擇結果。爲了在HAVING子句中使用SID,我需要將它包含在括號內的SELECT運算符中,這就是爲什麼我得到2列的原因。如何對多個colums(ex。2)進行SELECT?

+0

你能用簡單的英語解釋你的查詢需要做什麼,如果可能的話還包括模式信息? –

回答

0

IN語句中不能有2列。 您可以從選擇中刪除SID,並僅在HAVING中使用它。您實際上並不需要檢索數據,並且您的IN子句將起作用。

+0

第一句話是正確的。最後是錯誤的。 –

+0

他們都錯了。我已經嘗試過,並給出的結果是: 錯誤1054:未知的列「SID」在「有子句」 – Jumpman

0

如果我理解正確的你,那麼你想是這樣的:

SELECT DName 
FROM drugs 
WHERE (DID, SID) IN 
(
    //Subquery 
) 
+0

你試過了嗎?它會因多種原因失敗:1.你不能像這樣使用。 2.內部查詢是錯誤的,因爲它在select子句中沒有出現在group by子句中或聚合函數中的列。 –

+0

@ZoharPeled 1.我們可以像這樣使用。 2.從問題中複製了內部查詢。將修改它。謝謝 – Beginner

+0

哇,我不知道!我自己是一個sql服務器人員,並且在sql server上會失敗。不知道你可以使用IN作爲MySql中的多列。我立場糾正。 –

0

回答更新。對不起,我已被刪除我以前的答案。並感謝ZoharPeled提醒我以前的答案是錯誤的。

如果我明白你的問題,這應該爲你工作:

SELECT DName 
FROM drugs 
WHERE DID IN (
    SELECT DID FROM(
     SELECT DID,SID,TotalCost 
     FROM transactions 
     GROUP BY TotalCost 
     HAVING SID = 1 AND TotalCost > 100 
    ) AS T 
) 
+0

內部查詢是錯誤的,因爲它在select子句中沒有出現在group by子句或聚合函數中的列。 –

+0

@ZoharPeled是的,我沒有注意到它。剛剛從op問題複製。感謝提醒。 – RubahMalam

0

您可以通過以下方式使用EXISTS

SELECT DName 
FROM drugs 
WHERE EXISTS 
(
    SELECT * 
    FROM transactions 
    WHERE SID = 1 
    AND TotalCost > 100 
    AND ( 
     drugs.DID = transactions.SID 
     OR drugs.DID = transactions.DID 
    ) 
) 
0

你必須有一些答案 - 但我會拋出一個替代選擇到環:

select DName 
    from drugs d 
inner join (
       SELECT DID 
        FROM transactions 
       WHERE SID = 1 
        AND TotalCost > 100 
      ) tx on d.Did =tx.Did 

我認爲(我打開糾正這裏)如果你使用類似...

select * 
    from table 
    where EXISTS in (// some subquery) 

...的EXISTS子句中的子查詢必須table發現的每個行運行。使用內部聯接方法,RDBMS將爲內聯表執行sql,然後將結果保存在內存中以回到其他表。對於小型桌子來說這很好 - 但對於較大的桌子,可能會有明顯的性能下降。