Vergleichen Sie den Wert einer Zeile mit mehreren Zeilen in einer anderen Tabelle

Stellen wir uns vor, ich habe zwei Tafeln von Orden, die ich mit einander vergleichen möchte.

orders { id int, price money } ordereditems { orderid int, itemid int, price money } 

wo orders.id = ordereditems.orderid

Natürlich ist das ein schlechtes Design, da beide Tische keinen Preis brauchen. Wie kann ich aber eine Abfrage entcasting, um herauszufinden, welche Zeilen in Aufträgen einen Preis haben, der mit der Summe der Preissäule in ordereditems übereinstimmt?

Wenn ich richtig verstehe:

 SELECT * FROM orders o LEFT JOIN OrderedItems ei ON o.Price = ei.Price WHERE ei.Price is NULL 
 SELECT a.id, a.price, b.price, CASE WHEN a.price = b.price THEN 'PRICE MATCHED' ELSE 'PRICE NOT MATCHED' END AS RESULT FROM orders a INNER JOIN ordereditems b ON a.id = b.orderid AND a.price IS NOT NULL 

–orders hat einen preis, der mit der summe der kursspalte in ordereditems übereinstimmt

 SELECT a.id, a.price, b.total_price, CASE WHEN a.price = b.total_price THEN 'PRICE MATCHED' ELSE 'PRICE NOT MATCHED' END AS RESULT FROM orders a INNER JOIN (SELECT orderid, Sum(price) AS total_price FROM ordereditems GROUP BY orderid) b ON a.id = b.orderid AND a.price IS NOT NULL 

Der einfachste path, um einen Wert aus zwei Spalten mit einem bestehenden vorzuziehen:

 SELECT SUM(COALESCE(o.price, oi.price)) as price -- reorder columns for prefer FROM orders o INNER JOIN -- if you are missing some rows use FULL JOIN ordereditems oi ON oi.id = o.id 

Sie können auch die untenstehende Abfrage verwenden, um die Bestell-ID mit dem nicht übereinstimmenden Preis zu erhalten

 SELECT o.id,MAX(o.price) AS price FROM orders o INNER JOIN ordereditems oi ON o.id=oi.orderid GROUP BY o.id HAVING SUM(oi.price)<>MAX(o.price)