2013-12-11 2 views
1

Я не очень опытный программист, поэтому, пожалуйста, несите меня! Мне нужно извлечь данные из таблицы (Chemie) на основе данных из другой таблицы (ProdDesigns). Очевидным ответом будет использование подзапросов. Что-то вроде этого:
SQL-подзапросы в C#

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 ВСЕГДА будет несколько записей, так что я получаю сообщение об ошибке «В лучшем случае одна запись может быть возвращен этим подзапросом» .so I «м думать об использовании временных таблиц и попытался следующее:

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

Пожалуйста, не извиняйтесь. Мы все прошли таким образом. Вы можете прочитать [FAQ] и [ask] как начало ';)' –

ответ

5

Я думаю, вы могли бы просто сделать

Version1

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

Version2 (результат не будет отличаться с INNER JOIN)

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

Version 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

Вы, ребята, потрясающие !! Спасибо вам много. – BabyDoll

0

нет необходимости использовать подзапрос, добавьте and proddesigns.batchno = 1234 после ON chemie.rmcode = proddesigns.rmcode и хорошо идти

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 Конечно, но мое решение исправляет ошибку, и у него уже был подзапрос. :-) –