AM.pm::get_warehouse: keinen teuren Cross Join
authorMoritz Bunkus <m.bunkus@linet-services.de>
Mon, 26 Aug 2013 13:57:39 +0000 (15:57 +0200)
committerMoritz Bunkus <m.bunkus@linet-services.de>
Mon, 26 Aug 2013 13:57:39 +0000 (15:57 +0200)
Ein Cross Join wird nicht benötigt, weil nur die Existenz einer Zeile
in mind. einer der beiden relevanten Tabellen interessant ist. Das
auch entsprechend coden.

Fixt #2359.

SL/AM.pm

index 5764c6a..adb240d 100644 (file)
--- a/SL/AM.pm
+++ b/SL/AM.pm
@@ -1900,15 +1900,14 @@ sub get_warehouse {
 
   map { $form->{$_} = $ref->{$_} } keys %{ $ref };
 
-  $query = qq|SELECT b.*, EXISTS
-                (SELECT i.warehouse_id, p.warehouse_id
-                 FROM inventory i, parts p
-                 WHERE i.bin_id = b.id
-                 OR    p.bin_id = b.id
-                 LIMIT 1)
-                AS in_use
-              FROM bin b
-              WHERE b.warehouse_id = ?|;
+  $query = <<SQL;
+    SELECT b.*,
+      (   EXISTS(SELECT i.bin_id FROM inventory i WHERE i.bin_id = b.id LIMIT 1)
+       OR EXISTS(SELECT p.bin_id FROM parts     p WHERE p.bin_id = b.id LIMIT 1))
+      AS in_use
+    FROM bin b
+    WHERE b.warehouse_id = ?
+SQL
 
   $form->{BINS} = selectall_hashref_query($form, $dbh, $query, conv_i($form->{id}));