2012-07-24 16 views
11
+------------------+ 
| id1 | id2 | bool | 
+------------------+ 
| 1 | 1 | F | 
| 1 | 2 | F | 
| 2 | 1 | F | 
+------------------+ 

UPDATE table_name 
SET bool = T 
WHERE (id1, id2) IN ((1,1),(2,1)) --Need work here 

तो मूल रूप से मैं चुनना चाहता हूं कि (id1, id2) = (value1, value2) की स्थितियां कहां से चुनें। नीचे बयान के समान:एसक्यूएल अपडेट जहां डेटा

WHERE id1 = value1 AND id2 = value2 
एक सरणी में मूल्यों के दस्तावेज़ में

तथापि। क्या यह संभव है?

अग्रिम धन्यवाद

संपादित करें: मैं एसक्यूएल सर्वर 2008 का उपयोग कर रहा मैं अगर यह बहुत स्पष्ट नहीं था माफी चाहता हूँ। मैं इसे संग्रहीत प्रक्रिया के रूप में रखने की कोशिश कर रहा हूं और इसे किसी सेवा से कॉल कर रहा हूं। इनपुट किसी प्रकार का सरणी (परिवर्तनीय आकार) होगा, और एक पंक्ति में दो आईडी के साथ एक मैच खोजें।

+3

आप किस डेटाबेस का उपयोग कर रहे हैं? –

उत्तर

2

यहाँ जिस तरह से MSSQL में यह करने के लिए है। आपको केवल आईडी 1 और आईडी 2 से एक मूल्य (इस उदाहरण में VARCHAR) बनाना है। इस मामले में आप मान सेट के साथ IN कथन का उपयोग कर सकते हैं। यदि आपको इन क्षेत्रों में अनुमति है तो आपको आईडी 1 और आईडी 2 में एनयूएलएल के बारे में सोचना चाहिए (बस जोड़ें: and id1 is not null and id2 is not null)।

UPDATE table_name 
SET bool = T 
WHERE convert(varchar(20),id1)+','+convert(varchar(20),id2) in ('1,1','2,1') 
+0

आपको बहुत बहुत धन्यवाद। यह बिल्कुल है। लेकिन वर्कर की तुलना करना वास्तव में अच्छा नहीं है, प्रदर्शन के अनुसार, है ना? –

+0

वास्तव में आप किसी भी प्रकार का खोज मूल्य बना सकते हैं। उदाहरण के लिए यदि id1 कहें, id2 हमेशा आपकी तालिका में <1000 आप इस WHERE कथन को प्रतिस्थापित कर सकते हैं: जहां id1 * 1000 + id2 में (1001,2001)। इस मामले में आप तारों में भी परिवर्तित नहीं होते हैं। – valex

0

यदि आप उपयोग कर रहे हैं एसक्यूएल सर्वर इस

 UPDATE table_name 
    SET bool = T 
    WHERE (convert(varchar 20, id1) + '-' + convert(varchar 20 , id2)) 
     IN (convert(varchar 20 , value1) + '-' + convert(varchar 20 , value2), 
     convert(varchar 20 , value3) + '-' + convert(varchar 20 , value4)); 

यह कोशिश की कोशिश करता है, तो आप ओरेकल

 UPDATE table_name 
    SET bool = T 
     WHERE (id1 || '-' || id2) IN (value1 || '-' || value2) 

उपयोग कर रहे हैं आमतौर पर हम खंड में उपयोग करते हैं हम और अधिक है कि एक मान से मेल करने के लिए है। आप (ID1 = मान 1 और आईडी 2 = मान 2) और (ID1 = value3 और आईडी 2 = VALUE4)

 UPDATE table_name 
    SET bool = T 
    WHERE (id1 || '-' || id2) IN (value1 || '-' || value2, value3 || '-' || value4) 
+0

उत्तर देने के लिए धन्यवाद। मैंने SQL सर्वर पर इसे आजमाया, और यह ठीक से निष्पादित किया गया। हालांकि परिणाम मैं नहीं देख रहा था। इसने मजाकिया परिणाम दिए, मुझे यकीन नहीं है कि कंडीशन स्टेटमेंट क्या करता है। क्या आप समझाने की देखभाल करेंगे, शायद अन्य सामानों के लिए लागू हो। धन्यवाद –

+0

मेरा कोड ऑरैकल के साथ अधिक उपयुक्त था क्योंकि मैं ऑरैकल का उपयोग करता हूं, मैं SQL सर्वर – user1512999

0

एक विचार यह सोचते हैं इस लक्ष्य को हासिल करने के लिए अस्थायी तालिका का इस्तेमाल करते हैं

Create Table #Temp 
(
    id1 int, 
    id2 int 
) 
insert into #Temp values(1,1) 
insert into #Temp values(1,2) 
insert into #Temp values(2,1) 
insert into #Temp values(2,2) 

--update data 
UPDATE 
table_name 
SET bool = T 
from table_name T1 
inner join #Temp T2 
on T1.Id1= T2.Id1 
and T1.Id2= T2.Id2 
0

यह प्रयास करें है - एसक्यूएल सर्वर 2008 संस्करण।

create table mytable 
(
id1 int, 
id2 int, 
bool char(1) 
); 

insert INTO mytable VALUES(1,1,'F'); 
insert INTO mytable VALUES(1,2,'F'); 
insert INTO mytable VALUES(2,1,'F'); 

SELECT * FROM mytable; 

update mytable 
set bool='T' 
WHERE exists (SELECT id1,id2 from mytable tb2 
where mytable.id1 = 1 AND mytable.id2 = 1 
or mytable.id1 = 2 AND mytable.id2 = 1); 

SELECT * from mytable; 
0

इस क्वेरी ओरेकल में काम करता है ...

UPDATE table_name 
SET BOOL = T 
WHERE (id1, id2) IN (SELECT 1,1 FROM DUAL UNION SELECT 2,1 FROM DUAL); 

कौन सा अपने डेटाबेस है?

+0

का उपयोग करके इसे फिर से समझाने के लिए अपना उत्तर संपादित करूंगा। मुझे खेद है कि मैंने यह विवरण नहीं दिया। मैं SQL सर्वर 2008 –

+0

का उपयोग कर रहा हूं, जहां स्थित स्थिति के लिए इनपुट डेटाटाइप है? मुझे लगता है कि एसआरएल सर्वर 2008 में ऐरे मौजूद नहीं है। – TechDo

0

आप मूल रूप से क्या करने की कोशिश कर रहे हैं? ऐसा करने का तरीका आपने इसे क्यों चुना है? ऐसा लगता है कि आप सेट-आधारित तर्क को समझने में थोड़ा अस्पष्ट हैं। अन्य पोस्टर्स द्वारा प्रदान किए गए प्रत्येक उत्तर मान्य हैं और काम करेंगे, लेकिन आपके उद्देश्य के लिए सबसे उपयुक्त नहीं हो सकते हैं। क्या यह मौजूदा डेटा सेट के खिलाफ प्रसंस्करण है? क्या यह डेटा लोड या सम्मिलित प्रक्रिया का हिस्सा है? आपके द्वारा सूचीबद्ध प्रत्येक आईडी फ़ील्ड में अद्वितीय मूल्यों की अपनी सीमा है। अपने उदाहरण के आधार पर ऐसा लगता है कि तुम क्या वास्तव में करना चाहते हैं अद्यतन bool मूल्य है जब आईडी 2 = 1

UPDATE table_name SET Bool = 'T' 
WHERE Id2 = 1 

अधिक होने की संभावना आप एक तर्क है कि कुछ डेटा के आधार पर बूल मान सेट विकसित करने के लिए इच्छुक रहे हैं नियम - उदाहरण के लिए यदि आईडी 2 आईडी 1 से कम या बराबर है। एक मामले में बयान यहाँ काम करता है:

UPDATE table_name SET Bool = CASE WHEN Id1 > Id2 THEN 'T' ELSE 'F' END 

यह कहीं अधिक कुशल है जब आप प्रत्येक और आप सम्मिलित मूल्यों के हर बदलाव के लिए अपने कहां खंड में में और/या नियम लिखने की तुलना में डेटा के बड़े सेट के साथ काम कर रहे हैं।

लागू करने के लिए जगह के बजाय फ़िल्टर के रूप में कहें तो/फिर तर्क टाइप करें।

छोटे डेटा प्रविष्टियों में (आप मैन्युअल रूप से तालिका फ़ील्ड में मान टाइप करते हैं, लेन-देन द्वारा किसी प्रकार के वेब फॉर्म लेनदेन से डालने वाले होते हैं) यह संभवतः मूल्य को मैन्युअल रूप से सेट करने के लिए सबसे सरल है, या इसे उसमें बनाएं आपके सिस्टम का प्रक्रियात्मक हिस्सा और तालिका में सत्यापन नियम लागू करें।

यदि आप एक संग्रहीत प्रक्रिया लिखना चाहते हैं जो ऐसा करता है तो आप आईडी मानों के लिए चर बनाते हैं और इन सिस्टम को बाहरी डेटाबेस को आपके डेटाबेस सिस्टम में ट्रांसमिट करने के लिए लिंक करते हैं। (मुझे लगता है कि आपने पहले ही टेबल संरचनाएं बनाई हैं);

CREATE PROCEDURE table_name_insert 
@Id1 Int NOT NULL, 
@Id2 Int NOT NULL 

-- If you want to execute the logic outside of the DB environment 
-- (perhaps as part of an SSIS package) then you will want to add this 
-- variable and pass it in explicitly. 

, @Bool bit NOT NULL 


AS 

DECLARE @sql nvarchar(4000) 


SET @sql = ' 
INSERT INTO table_name (ID1, ID2, Bool) 
SELECT @Id1, @Id2, [Case Logic or Variable Value for Bool] 
' EXEC sp_executeSQL @sql 

इस प्रक्रिया को अपने कार्यक्रम से कहा जा सकता है और आप चर आप इसे में एक सरणी से उत्पन्न हो सकता है गुजरती हैं। ऐसे तरीके भी हैं जहां आप सीधे उचित कॉलम पर मान आयात कर सकते हैं और फिर पोस्ट-डालने कोड में बूल तर्क निष्पादित कर सकते हैं। हर मामले को संभालने के लिए "हार्ड कोडिंग" एक WHERE कथन अक्षम है, और इसमें आने की एक बुरी आदत है।

0

आप संग्रहीत प्रक्रिया में एक्सएमएल के रूप में अपनी मूल्यों की सूची भेज सकते हैं। एक्सएमएल को टेबल वेरिएबल में अनपैक करें और उन पंक्तियों को ढूंढने के लिए exists का उपयोग करें जिन्हें आपको अपडेट करना चाहिए।

create procedure YourSP 
    @XMLParam xml 
as 

declare @T table(id1 int, id2 int) 

insert into @T(id1, id2) 
select T.N.value('id1[1]', 'int'), 
     T.N.value('id2[1]', 'int') 
from @XMLParam.nodes('/Row') as T(N) 

update table_name 
set bool = 'T' 
where exists (select * 
       from @T as T 
       where T.id1 = table_name.id1 and 
        T.id2 = table_name.id2) 

इस तरह कॉल:

exec YourSP '<Row> 
       <id1>1</id1> 
       <id2>1</id2> 
      </Row> 
      <Row> 
       <id1>2</id1> 
       <id2>1</id2> 
      </Row>' 
संबंधित मुद्दे