أخطاء SQL Server 2005 عندما تجمع استخدام الاستعلام الفرعي
-
06-07-2019 - |
سؤال
باستخدام SQL Server 2005 أحاول المجموعة على أساس بيان حالة مع فرعي ، ولكن أنا الحصول على خطأ ("كل مجموعة من خلال التعبير يجب أن يحتوي على عمود واحد على الأقل الإشارة.").أنا يمكن أن تعمل جولة ذلك بسهولة تامة ، ولكن يمكن لأي شخص أن يشرح الخطأ ؟ لقد حصلت على عمود الإشارة إلى #header.رأس.
create table #header (header int)
create table #detail (header int, detail int)
insert into #header values (1)
insert into #header values (2)
insert into #header values (3)
insert into #detail values (1, 1)
insert into #detail values (2, 1)
--error: Each GROUP BY expression must contain at least one column reference.
select case when exists (select 1 from #detail where #detail.header = #header.header) then 1 else 0 end hasrecords from #header
group by case when exists (select 1 from #detail where #detail.header = #header.header) then 1 else 0 end
--results I want
select hasrecords, count(*) from
(
select case when exists (select 1 from #detail where #detail.header = #header.header) then 1 else 0 end hasrecords from #header
) hasrecords
group by hasrecords
drop table #header
drop table #detail
[تحرير] ملاحظة (ردا على التعليق) المترابطة وغير المترابطة الاستعلامات الفرعية:
--correlated
select header, case when exists (select 1 from #detail where #detail.header = #header.header) then 1 else 0 end hasrecords from #header
--non-correlated
select #header.header, case when count(#detail.header) > 0 then 1 else 0 end hasrecords from #header left join #detail on #header.header = #detail.header group by #header.header
المحلول
لبدء لو نعطي كامل الخطأ ، فإنه ينبغي أن تقرأ "كل مجموعة من خلال التعبير يجب أن يحتوي على عمود واحد على الأقل هذا ليس الخارجي المرجعية."
فهم خطأ, نحن بحاجة إلى توضيح ما هو المقصود من قبل 'الخارجي إشارة'
(ملاحظة:في هذه الحالة فإنه لا علاقة له مع الداخلي أو الخارجي ينضم)
على الداخلية و الخارجي في إشارة إلى الاستعلام الرئيسي و هو الاستعلامات الفرعية.في هذه الحالة EXISTS
هو فرعي و هو يرتبط الاستعلام الفرعي كما أنه يحتوي على المراجع الخارجي #header.header
, الذي هو الرجوع إلى الجدول الخارجي #header
, بينما أي إشارة إلى #detail
يعتبر الداخلي المراجع.
حتى في الجوهر ، لأن CASE
يستخدم استعلام فرعي correlated مراجع الاستعلام الخارجي ، ثم هذه الحرائق الخطأ الدولة ، نتيجة تظهر رسالة الخطأ هذه عند محاولة استخدام فقط التعبيرات في مجموعة من شرط أن يتم تفسيره على المراجع الخارجي.
الاستعلامات الفرعية يمكن يمكن استخدامها في مجموعة ولكن لا يرتبط الاستعلامات الفرعية.
مشوش ، نفس الخطأ يمكن أن تتولد من غير subqueried أبسط الاستعلام مثل
select
case when header=1 then 1
else 0
end headeris1,
'constant'
from #header
group by case when header=1 then 1 else 0 end , 'constant'
أو حتى استبدال المستمر مع @variable
واضح الطين ؟
كيف
نصائح أخرى
وأنت تقول أن مجموعة من 1 أو 0 عندما تحتاج إلى إعطائها عمود الفعلي لمجموعة من (رأس)، وليس القيمة.
وحتى لو كنت أنا فهم الحق كنت ترغب قائمة رؤوس وعدد من سجلات التفصيل بهم؟
وهذا قد عمل لك؟
SELECT DISTINCT h.header, COUNT(d.detail) AS detail_count
FROM #header AS h
LEFT JOIN #detail AS d ON d.header = h.header
GROUP BY h.header, d.detail
ومع نتائج مثل ...
header detail_count
1 1
2 1
3 0