يمكنك إنشاء متداخلة مع بنود الجدول المشترك العبارات ؟
-
06-07-2019 - |
سؤال
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 أخرى