سؤال
ونظرا لهذه الجدولين:
Foo (id, name) -- PK = id
Bar (fooId, value) -- PK = composite, fooId + value
-- value is a non-negative int
وكيف يمكن أن أجد كافة Foo.name
s حيث لا يوجد 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)
لا تنتمي إلى StackOverflow