سؤال

استباقية الاعتذار لا معنى لها الجدول/عمود أسماء على هذه الاستفسارات.إذا كنت قد عملت من أي وقت مضى مع DB الخلفية من العلاج, سوف تفهم.

لدي مشكلة حيث عدد متميزة تعود قيمة null, عندما تشك في القيمة الفعلية يجب أن تكون في مكان ما في 20 (23 ، أعتقد).أدناه هو عبارة عن سلسلة من الاستفسارات عودتهم القيم.

SELECT count(distinct t442.c1)
      FROM t442, t658, t631
     WHERE t442.c1 = t658.c536870930
       AND t442.c200000003 = 'Network'
       AND t442.c536871139 < 2
       AND t631.c536870913 = t442.c1
       AND t658.c536870925 = 1
       AND (t442.c7 = 6 OR t442.c7 = 5)
       AND t442.c536870954 > 1141300800
       AND (t442.c240000010 = 0)

النتيجة = 497.

إضافة جدول t649 وتأكد من أنه يحتوي على سجلات مرتبطة العودة إلى طاولة t442:

 SELECT COUNT (DISTINCT t442.c1)
              FROM t442, t658, t631, t649
             WHERE t442.c1 = t658.c536870930
               AND t442.c200000003 = 'Network'
               AND t442.c536871139 < 2
               AND t631.c536870913 = t442.c1
               AND t658.c536870925 = 1
               AND (t442.c7 = 6 OR t442.c7 = 5)
               AND t442.c536870954 > 1141300800
               AND (t442.c240000010 = 0)
               AND t442.c1 = t649.c536870914

النتيجة = 263.

تصفية السجلات في الجدول t649 حيث العمود c536870939 <= 1:

SELECT COUNT (DISTINCT t442.c1)
          FROM t442, t658, t631, t649
         WHERE t442.c1 = t658.c536870930
           AND t442.c200000003 = 'Network'
           AND t442.c536871139 < 2
           AND t631.c536870913 = t442.c1
           AND t658.c536870925 = 1
           AND (t442.c7 = 6 OR t442.c7 = 5)
           AND t442.c536870954 > 1141300800
           AND (t442.c240000010 = 0)
           AND t442.c1 = t649.c536870914
           AND t649.c536870939 > 1

النتيجة = 24.

تصفية على وجود البيان:

SELECT COUNT (DISTINCT t442.c1)
          FROM t442, t658, t631, t649
         WHERE t442.c1 = t658.c536870930
           AND t442.c200000003 = 'Network'
           AND t442.c536871139 < 2
           AND t631.c536870913 = t442.c1
           AND t658.c536870925 = 1
           AND (t442.c7 = 6 OR t442.c7 = 5)
           AND t442.c536870954 > 1141300800
           AND (t442.c240000010 = 0)
           AND t442.c1 = t649.c536870914
           AND t649.c536870939 > 1
        HAVING COUNT (DISTINCT t631.c536870922) =
                                              COUNT (DISTINCT t649.c536870931)

النتيجة = null.

إذا قمت بتشغيل الاستعلام التالي, لا أستطيع أن أرى أي شيء في قائمة النتائج أن يفسر لماذا لا أحصل على أي نوع من قيمة الإرجاع.وهذا صحيح حتى إذا كنت إزالة متميزة من تحديد.(أحصل على 25 و 4265 صفوف من البيانات ، على التوالي).

SELECT DISTINCT t442.c1, t631.c536870922, t649.c536870931
          FROM t442, t658, t631, t649
         WHERE t442.c1 = t658.c536870930
           AND t442.c200000003 = 'Network'
           AND t442.c536871139 < 2
           AND t631.c536870913 = t442.c1
           AND t658.c536870925 = 1
           AND (t442.c7 = 6 OR t442.c7 = 5)
           AND t442.c536870954 > 1141300800
           AND (t442.c240000010 = 0)
           AND t442.c1 = t649.c536870914
           AND t649.c536870939 > 1

لدي العديد من الأماكن الأخرى التي يجب الاستعلام إعداد بالضبط مثل تلك التي يتم إرجاع قيمة فارغة و تعمل بشكل جيد تماما-العودة للاستخدام الأرقام التي هي القيم الصحيحة.يجب أن نفترض أن كل ما هو فريد من نوعه في هذه الحالة هو ذات الصلة إلى البيانات الفعلية الاستعلام, ولكن لست متأكدا ما الذي تبحث عنه في البيانات لشرح ذلك.لم أكن قادرة على العثور على أي قيم فارغة في البيانات الخام قبل التجميع.لا أدري ما سبب هذا.

سيكون موضع تقدير أي مساعدة.

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

المحلول

أنا أفهم الآن.المشكلة في الاستعلام الأصلي هو غير عادي للغاية (إن لم يكن في الواقع خطأ) لاستخدام وجود الشرط دون مجموعة BY.الجواب يكمن في ترتيب العملية أجزاء مختلفة من الاستعلام يتم تنفيذها.

في البحث الأصلي ، يمكنك القيام بذلك:

SELECT COUNT(DISTINCT t442.c1)
  FROM ...
 WHERE ...
HAVING COUNT(DISTINCT t631.c536870922) = COUNT(DISTINCT t649.c536870931);

قاعدة البيانات سوف تؤدي بك ينضم والقيود, وعند هذه النقطة سوف تفعل أي مجموعة من عمليات التجميع.في هذه الحالة أنت لا تجمع العدد العمليات عبر مجموعة البيانات بأكملها.استنادا إلى القيم التي نشرت أعلاه ، عدد(متميزة t631.c536870922) = 25 عدد(متميزة t649.c536870931) = 24.وجود شرط يحصل الآن التطبيقية ، مما أدى إلى شيء مطابقة الخاص بك يسأل عن الحالات التي يكون فيها عدد إجمالي مجموعة (على الرغم من أن هناك العديد c1s) متساوية ، و هم لا.متميزة يحصل تطبيق النتائج فارغة, و لن تحصل على شيء.

ما كنت حقا تريد القيام به هو مجرد نسخة من ما نشر في المثال الذي بصق الصفوف التهم:

SELECT count(*)
  FROM (SELECT t442.c1     
          FROM t442
             , t658
             , t631
             , t649
         WHERE t442.c1 = t658.c536870930
           AND t442.c200000003 = 'Network'
           AND t442.c536871139 < 2
           AND t631.c536870913 = t442.c1
           AND t658.c536870925 = 1
           AND (   t442.c7 = 6
                OR t442.c7 = 5)
           AND t442.c536870954 > 1141300800
           AND (t442.c240000010 = 0)
           AND t442.c1 = t649.c536870914
           AND t649.c536870939 > 1
         GROUP BY t442.c1
        HAVING COUNT(DISTINCT t631.c536870922) = COUNT(DISTINCT t649.c536870931)
       );

هذا وسوف تعطيك قائمة من c1 الأعمدة التي تحتوي على أعداد متساوية من 631 & 649 إدخالات جدول.ملاحظة:يجب أن تكون حذرا جدا حول استخدام متميزة في الاستفسارات الخاصة بك.على سبيل المثال ، في حالة حيث كنت في نشر النتائج أعلاه ، هو تماما لا لزوم لها ؛ في كثير من الأحيان أنها بمثابة نوع من ورق الجدران لتغطية أكثر الأخطاء في الاستعلامات التي لا عودة النتائج بالطريقة التي تريدها بسبب غاب القيد في جملة WHERE ("همم, الاستعلام بلدي هو العودة المغفلين لكل هذه القيم.حسنا, متميزة سيتم إصلاح هذه المشكلة").

نصائح أخرى

ما هي النتيجة:

SELECT COUNT (DISTINCT t631.c536870922),
       COUNT (DISTINCT t649.c536870931)
          FROM t442, t658, t631, t649
         WHERE t442.c1 = t658.c536870930
           AND t442.c200000003 = 'Network'
           AND t442.c536871139 < 2
           AND t631.c536870913 = t442.c1
           AND t658.c536870925 = 1
           AND (t442.c7 = 6 OR t442.c7 = 5)
           AND t442.c536870954 > 1141300800
           AND (t442.c240000010 = 0)
           AND t442.c1 = t649.c536870914
           AND t649.c536870939 > 1

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

COUNT(DISTINCT column) لا تحتسب NULL القيم:

SELECT  COUNT(DISTINCT val1)
FROM    (
        SELECT  NULL AS val1
        FROM    dual
        )

---
0

يمكن أن تكون هذه القضية ؟

وأود أن محاولة وضع وجود شرط الشروط في جملة WHERE بدلا من ذلك.هل هناك أي سبب اخترت ؟ فقط لمعلوماتك وجود هو مرشح أن يتم ذلك بعد إرجاع النتائج التي قد تسبب نتائج غير متوقعة.كما أنه لا يستخدم في الاستفادة المثلى من الاستعلام.إذا لم يكن لديك لاستخدام وجود أود أن أقترح عدم استخدامه.

أود أن أقترح إضافة التهم على SELECT ثم الانضمام لهم في جملة WHERE.

إذا كنت تفعل هذا:

SELECT distinct t442.c1, count(distinct t631.c536870922), 
    count (distinct t649.c536870931)
          FROM t442, t658, t631, t649
         WHERE t442.c1 = t658.c536870930
           AND t442.c200000003 = 'Network'
           AND t442.c536871139 < 2
           AND t631.c536870913 = t442.c1
           AND t658.c536870925 = 1
           AND (t442.c7 = 6 OR t442.c7 = 5)
           AND t442.c536870954 > 1141300800
           AND (t442.c240000010 = 0)
           AND t442.c1 = t649.c536870914
           AND t649.c536870939 > 1
           group by t442.c1
           having count(distinct t631.c536870922)= 
                         count (distinct t649.c536870931)

أرى 23 الصفوف التي يجب أن تحسب.إزالة الحاجة بيان عوائد 24 صفوف إضافية واحدة لا تفي أن وجود المعايير.

تحرير:نتائج الاستعلام ، على النحو المطلوب في ستيف Broberg:

row | t442.c1         | cnt t631 | cnt 649
-------------------------------------------
1   | CHG000000230378 |    2     |    1
2   | CHG000000230846 |    1     |    1
3   | CHG000000232562 |    1     |    1
4   | CHG000000232955 |    1     |    1
5   | CHG000000232956 |    1     |    1
6   | CHG000000232958 |    1     |    1
7   | CHG000000233027 |    1     |    1
8   | CHG000000233933 |    1     |    1
9   | CHG000000233934 |    1     |    1
10  | CHG000000233997 |    1     |    1
11  | CHG000000233998 |    1     |    1
12  | CHG000000233999 |    1     |    1
13  | CHG000000234001 |    1     |    1
14  | CHG000000234005 |    1     |    1
15  | CHG000000234009 |    1     |    1
16  | CHG000000234012 |    1     |    1
17  | CHG000000234693 |    1     |    1
18  | CHG000000234696 |    1     |    1
19  | CHG000000234730 |    1     |    1
20  | CHG000000234839 |    1     |    1
21  | CHG000000235115 |    1     |    1
22  | CHG000000235224 |    1     |    1
23  | CHG000000235488 |    1     |    1
24  | CHG000000235847 |    1     |    1 

الصف الأول يتم تصفيتها بشكل صحيح إذا لم تتضمن وجود الشرط.

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