سؤال

ونظرا لهذه الجدولين:

Foo (id, name)       -- PK = id
Bar (fooId, value)   -- PK = composite, fooId + value
                     -- value is a non-negative int

وكيف يمكن أن أجد كافة Foo.names حيث لا يوجد Bar,value المقابلة فوق 0؟

وعلى سبيل المثال:

Foo
id   name
1    a
2    b
3    c

Bar
fooid    value
1        0
1        1
2        0
3        4

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

المحلول

وأجد ما يلي أسهل للقراءة وفهم ...

SELECT foo.name
FROM foo
WHERE NOT EXISTS (SELECT 'x'
                  FROM bar
                  WHERE bar.fooid = foo.id
                    AND bar.value > 0)

نصائح أخرى

SELECT Name
FROM Bar
INNER JOIN Foo ON Foo.Id = Bar.fooId
GROUP BY fooId, name
HAVING SUM(Value) = 0

وهذا الاستعلام واحد المرسلة بواسطة zodeus يستغرق حوالي نفس المدة الزمنية للتنفيذ، ولكن هذا واحد لن تتضمن أي سجلات فو التي لا يتم الرجوع إليها في الجدول بار. على سبيل المثال إذا كان لديك أيضا الرقم القياسي فو (4، د)، هذا الاستعلام سيظل عودة "ب"، حيث كما أن الاستعلام zodeus ستعود "ب" و "د".

SELECT name FROM FOO WHERE id NOT IN(
    SELECT fooId FROM Bar GROUP BY fooId HAVING MAX(Value) > 0)
select Foo.name 
from Foo
where Foo.id not in 
(select Bar.fooid from Bar
where value > 0)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top