سؤال

WITH y AS (
    WITH x AS (
        SELECT * FROM MyTable
    )
    SELECT * FROM x
)
SELECT * FROM y

لا شيء مثل هذا العمل ؟ حاولت في وقت سابق ولكن لم أستطع الحصول على عمل.

هل كانت مفيدة؟

المحلول

وحين لا تتداخل بدقة، يمكنك استخدام تعبيرات طاولة مشتركة لإعادة الاستفسارات السابقة في المخططات اللاحقة.

لذلك، شكل البيان الذي تبحث عنه سيكون

WITH x AS 
(
    SELECT * FROM MyTable
), 
y AS 
(
    SELECT * FROM x
)
SELECT * FROM y

نصائح أخرى

ويمكنك القيام بما يلي، والتي يشار اليها على انها استعلام عودي:

WITH y
AS
(
  SELECT x, y, z
  FROM MyTable
  WHERE [base_condition]

  UNION ALL

  SELECT x, y, z
  FROM MyTable M
  INNER JOIN y ON M.[some_other_condition] = y.[some_other_condition]
)
SELECT *
FROM y

وأنت قد لا تحتاج هذه الوظيفة. لقد فعلت ما يلي فقط لتنظيم الاستفسارات بلدي أفضل:

WITH y 
AS
(
  SELECT * 
  FROM MyTable
  WHERE [base_condition]
),
x
AS
(
  SELECT * 
  FROM y
  WHERE [something_else]
)
SELECT * 
FROM x

مع عدم العمل جزءا لا يتجزأ من, ولكنه عمل متتالية

;WITH A AS(
...
),
B AS(
...
)
SELECT *
FROM A
UNION ALL
SELECT *
FROM B

تحرير ثابت في الجملة...

أيضا إلقاء نظرة على المثال التالي

SQLFiddle DEMO

وهذه الإجابات هي جيدة جدا، ولكن بقدر الحصول على سلع وفي النظام بشكل صحيح، وكنت أفضل حالا شاهدوا هذا المقال HTTP: // dataeducation.com/dr-output-or-how-i-learned-to-stop-worrying-and-love-the-merge

وهنا مثال الاستعلام له.

WITH paths AS ( 
    SELECT 
        EmployeeID, 
        CONVERT(VARCHAR(900), CONCAT('.', EmployeeID, '.')) AS FullPath 
    FROM EmployeeHierarchyWide 
    WHERE ManagerID IS NULL

    UNION ALL

    SELECT 
        ehw.EmployeeID, 
        CONVERT(VARCHAR(900), CONCAT(p.FullPath, ehw.EmployeeID, '.')) AS FullPath 
    FROM paths AS p 
        JOIN EmployeeHierarchyWide AS ehw ON ehw.ManagerID = p.EmployeeID 
) 
SELECT * FROM paths order by FullPath

ونحن يمكن أن تخلق cte.please متداخلة انظر أدناه كوت في المثال

;with cte_data as 
(
Select * from [HumanResources].[Department]
),cte_data1 as
(
Select * from [HumanResources].[Department]
)

select * from cte_data,cte_data1

وكنت أحاول أن قياس الوقت بين الأحداث باستثناء ما دخول واحدة لديها عمليات متعددة بين بداية ونهاية. أنا بحاجة إلى هذا في سياق عمليات سطر واحد أخرى.

واعتدت مختارة مع صلة داخلية كما حدد بياني داخل كوت نطة. وكوت الثانية كنت بحاجة لاستخراج تاريخ البدء على X وتاريخ انتهاء على Y والمستعملة 1 باعتبارها قيمة id إلى اليسار الانضمام لوضعها على خط واحد.

ويعمل بالنسبة لي، آمل أن يساعد هذا.

cte_extract
as 
(
    select ps.Process as ProcessEvent
        , ps.ProcessStartDate 
        , ps.ProcessEndDate 
        -- select strt.*
    from dbo.tbl_some_table ps 
    inner join (select max(ProcessStatusId) ProcessStatusId 
                    from dbo.tbl_some_table 
                where Process = 'some_extract_tbl' 
                and convert(varchar(10), ProcessStartDate, 112) < '29991231'
                ) strt on strt.ProcessStatusId = ps.ProcessStatusID
), 
cte_rls
as 
(
    select 'Sample' as ProcessEvent, 
     x.ProcessStartDate, y.ProcessEndDate  from (
    select 1 as Id, ps.Process as ProcessEvent
        , ps.ProcessStartDate 
        , ps.ProcessEndDate
        -- select strt.*
    from dbo.tbl_some_table ps 
    inner join (select max(ProcessStatusId) ProcessStatusId 
                    from dbo.tbl_some_table 
                where Process = 'XX Prcss' 
                and convert(varchar(10), ProcessStartDate, 112) < '29991231'
                ) strt on strt.ProcessStatusId = ps.ProcessStatusID
    ) x
    left join (
        select 1 as Id, ps.Process as ProcessEvent
            , ps.ProcessStartDate 
            , ps.ProcessEndDate
            -- select strt.*
        from dbo.tbl_some_table ps 
        inner join (select max(ProcessStatusId) ProcessStatusId
                    from dbo.tbl_some_table 
                    where Process = 'YY Prcss Cmpltd' 
                    and convert(varchar(10), ProcessEndDate, 112) < '29991231'
                    ) enddt on enddt.ProcessStatusId = ps.ProcessStatusID
            ) y on y.Id = x.Id 
),

و.... ctes أخرى

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top