2009-01-28 4 views
13

मुझे ऐसा कुछ करने की ज़रूरत है लेकिन SQL Server 2008 इसे पसंद नहीं करता है। मेरी क्वेरी वास्तव में इससे अधिक जटिल है और मुझे एहसास है कि मैं जो कर रहा हूं उसे पूरा करने का यह सबसे अच्छा तरीका नहीं है लेकिन मेरा ध्यान अंतर्दृष्टि की कार्यक्षमता पर है, न कि चयन और कहां बयान।क्या मैं अपने उदाहरण की तरह परिणाम सेट को फ़िल्टर करने के लिए दो बार टीएसक्यूएल में उपयोग कर सकता हूं?

stuff1 के साथ

( चयन नाम, StartDate, आईडी कर्मचारियों से जहां StartDate> 0)

stuff2 के रूप में ( चयन नाम, StartDate, आईडी stuff1 से) के साथ

चयन * stuff2 से जहां आईडी> 10

+0

आपको एक – Juliet

उत्तर

29

मैं यह सब समय :

WITH stuff1 AS (
    SELECT name 
      ,startdate 
      ,id 
    FROM employees 
    WHERE startdate > 0 
) 
,stuff2 AS (
    SELECT name 
      ,startdate 
      ,id 
    FROM stuff1 
) 
SELECT * 
FROM stuff2 
WHERE id > 10 

जहां तक ​​मेरा बता सकते हैं, मैं सीटीई में एक सीमा तक नहीं पहुंचे हैं।

WITH stuff1 AS (
    SELECT name 
      ,startdate 
      ,id 
    FROM employees 
    WHERE startdate > 0 
) 
,stuff2 AS (
    SELECT name 
      ,startdate 
      ,id 
    FROM stuff1 
) 
SELECT * 
FROM stuff2 
WHERE id > 10 
; 
SELECT * 
FROM stuff2 
WHERE id < 10 

कहते हैं:

केवल एक चीज आप ऐसा नहीं कर सकते हैं (जो बहुत उपयोगी होगा) अलग SELECT रों में पुन: उपयोग सीटीई है। इसके बजाय आपको पूरी सीटीई श्रृंखला को दोबारा कॉपी और पेस्ट करना होगा।

+0

उपर्युक्त काम करता है; पहले और दूसरे चयन के बीच टर्मिनेटर? –

+0

नहीं सीटीई का उपयोग केवल एक ही ऑपरेशन पर किया जा सकता है। INSERT/चुनें/हटाएं जो भी हो, लेकिन मूल रूप से उस बिंदु पर उनका उपभोग किया जाता है। –

+0

जानना अच्छा है, धन्यवाद! –

-3

नहीं, आप केवल एक दिन में एक सीटीई प्राप्त कर सकते हैं जैसा कि मैंने दूसरे दिन पाया था।

EDIT: और यह बयान के साथ एक सामान्य तालिका अभिव्यक्ति, बहुत आसान सुविधा है।

+0

की आवश्यकता होने पर एक temp तालिका या तालिका चर का उपयोग करने में कोई शर्म नहीं है, असल में, आपके पास एकाधिक सीटीई हो सकते हैं, और वे सीटीई श्रृंखला के भीतर एक-दूसरे और यहां तक ​​कि कई सीटीई भी बना सकते हैं, एक अल्पविराम से अलग - केवल एक बयान के साथ इस्तेमाल किया जा सकता है। –

+0

मुझे एहसास नहीं हुआ था कि उन्हें अल्पविराम से अलग होना था। यह आसान होगा। मैं अपनी एसक्यूएल 2008 पुस्तक पढ़ रहा हूं और वे सीटीई का उल्लेख करते हैं, लेकिन वे एक प्रश्न में एकाधिक सीटीई के उपयोग का जिक्र नहीं करते हैं, जो शर्म की बात है। – Kezzer

+0

हाँ, मैंने नीचे एक उदाहरण पोस्ट किया है। मैं पिछले साल एक 3 जीएल सिस्टम से बंदरगाह में बहुत भारी उपयोग कर रहा हूं। –

0

आप हमें उप-प्रश्नों की एक श्रृंखला में सक्षम हो सकते हैं। या सीटीई में निहित उप-प्रश्न।

उप प्रश्नों का एक उदाहरण

नॉर्थविंड का उपयोग कर:

SELECT * FROM 
    (SELECT * FROM 
     (SELECT * FROM dbo.Employees WHERE Country = 'USA') as TableFiltered1 
    ) AS TableFilterd2 WHERE City = 'Seattle' 

आप दो सीटीई, लेकिन शायद नहीं जिस तरह से आप के लिए, को देखने और उसका उपयोग कर सकते हैं:
http://www.4guysfromrolla.com/webtech/071906-1.shtml

+1

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

+0

मैं सहमत हूं। यही कारण है कि मैंने लिंक शामिल किया जो अल्पविराम से अलग सीटीई का एक उदाहरण दिखाता है। मुझे लगता है कि यह '4guys' लिंक में तीसरा या चौथा उदाहरण है। मैं सभी विकल्पों को लेआउट करने की कोशिश कर रहा था। – BuddyJoe

संबंधित मुद्दे

 संबंधित मुद्दे