2013-12-11 79 views
1

我不是一個非常有經驗的程序員,所以請耐心等待!我必須根據另一個表格(ProdDesigns)的數據從表格(Chemie)中提取數據。顯而易見的答案是使用子查詢。事情是這樣的:
C中的SQL子查詢#

SELECT chemie.rmcode, 
     chemie.sio2, 
     chemie.al2o3, 
     chemie.fe2o3, 
     chemie.feo, 
     chemie.tio2, 
     chemie.cao, 
     chemie.mgo, 
     chemie.na2o, 
     chemie.k2o, 
     chemie.cr2o3, 
     chemie.p2o5, 
     chemie.sic, 
     chemie.c, 
     chemie.mno, 
     chemie.zro2, 
     chemie.b2o3 
FROM chemie 
     INNER JOIN proddesigns 
       ON chemie.rmcode = proddesigns.rmcode 
WHERE chemie.rmcode = (SELECT proddesigns.rmcode 
         FROM proddesigns 
         WHERE proddesigns.batchno = 1234) 

的問題是,從表ProdDesigns數據的子集將永遠是多條記錄,所以我得到的錯誤。所以我「最多一個記錄可以通過該子查詢將返回」想着使用臨時表並嘗試以下內容:

conn.Open(); 
OleDbCommand cmdRM = null; 
cmdRM = conn.CreateCommand(); 
cmdRM.CommandText = (@"SELECT * INTO ##tempTest FROM ProdDesigns WHERE batchNo = 1234"); 
cmdRM.ExecuteNonQuery(); 
dataAdapter2 = new OleDbDataAdapter(@"SELECT Chemie.RMCode, Chemie.SiO2, Chemie.Al2O3, Chemie.Fe2O3, Chemie.FeO, Chemie.TiO2, Chemie.CaO, Chemie.MgO, Chemie.Na2O, Chemie.K2O, Chemie.Cr2O3, Chemie.P2O5, Chemie.SiC, Chemie.C, Chemie.MnO, Chemie.ZrO2, Chemie.B2O3 
     FROM Chemie INNER JOIN ##tempTest ON Chemie.RMCode = ##tempTest.rmCode 
     WHERE ((Chemie.RMCode)= ##tempTest.rmCode)", conn); 
dataAdapter2.Fill(dataS2, "Chemie"); 
dtChem = dataS2.Tables["Chemie"]; 

任何反饋將不勝感激!

+0

良好的格式始終是你的朋友。 –

+0

這是我的第一篇文章,所以我對可憐的格式化,縮進等等道歉。 – BabyDoll

+0

請不要道歉。我們都以這種方式通過..你可以閱讀[常問問題]和[問]作爲開始';) –

回答

5

我認爲你可以只是做

版本1

FROM chemie 
INNER JOIN proddesigns 
      ON chemie.rmcode = proddesigns.rmcode and proddesigns.batchno = 1234 

版本2(結果會不會不同與INNER JOIN)

FROM chemie 
    INNER JOIN proddesigns 
       ON chemie.rmcode = proddesigns.rmcode 
WHERE proddesigns.batchno = 1234 

3版

SELECT c.rmcode, 
     --xxx 
FROM chemie c 
where exists (select null from proddesigns p 
       where c.rmcode = p.rmcode 
       and p.batchno = 1234) 

您應該選擇哪一個?

那麼,這是你的選擇。 我會採取(按優先順序)3,1,2,因爲你並不真正「需要加入」。

你只是想從化學的價值觀,在proddesigns有關的東西。

exists條款對我來說更加清晰。 但這只是一個觀點。

但是,如果您需要proddesigns中的數據,請使用連接。

順便說一句,與JOIN版本可以檢索更多的行比你需要的。 這不應該發生在您的數據,但會發生,如果你有兩個proddesigns相同的rmcode和batchno = 1234。

+0

+1第一個 –

+0

不知道你可以'加入'在多個條件。每天學習新東西:) – Nunners

+0

你們真棒!謝謝sooo – BabyDoll

0

沒有必要使用子查詢,ON chemie.rmcode = proddesigns.rmcode後追加and proddesigns.batchno = 1234和良好的去

0

變化

WHERE chemie.rmcode = (SELECT proddesigns.rmcode 
        FROM proddesigns 
        WHERE proddesigns.batchno = 1234) 

WHERE chemie.rmcode in (SELECT proddesigns.rmcode 
        FROM proddesigns 
        WHERE proddesigns.batchno = 1234) 
0

您可以優化您的查詢變化:

WHERE chemie.rmcode = (SELECT proddesigns.rmcode 
         FROM proddesigns 
         WHERE proddesigns.batchno = 1234) 

WHERE proddesigns.batchno = 1234 

我想你很快就發現性能上的差異,而不使用子查詢。

另一種方法是把這個條件在INNER JOIN聲明:

INNER JOIN proddesigns ON chemie.rmcode = proddesigns.rmcode and proddesigns.batchno = 1234 
0

你可以簡單地添加一個TOP 1到您的子查詢

WHERE chemie.rmcode = (SELECT TOP 1 proddesigns.rmcode 
         FROM proddesigns 
         WHERE proddesigns.batchno = 1234) 

這可以確保只返回一個記錄。


我知道你得到了解決了,但如果你想要一個結果子查詢的每一個結果,你也可以使用了IN

WHERE chemie.rmcode IN (SELECT proddesigns.rmcode 
         FROM proddesigns 
         WHERE proddesigns.batchno = 1234) 
+0

有點過分使用子查詢,不是嗎? –

+0

事情是我需要多個記錄返回,但我得到了解決方案。感謝您的反饋,我確信這個提示將在未來派上用場! – BabyDoll

+0

@RaphaëlAlthaus當然,但我的解決方案修復了錯誤,他已經有了子查詢。 :-) –