I Ergebnisse aus dem zweiten Abfrage-Ergebnissen aus der ersten Abfrage möchte außer Kraft zu setzen:Union Abfrage verschiedene auf einer Spalte
SELECT "panel_restaurants_restaurant"."id",
"panel_restaurants_restaurant"."name",
"panel_restaurants_restaurant"."logo",
"panel_restaurants_restaurantfeatures"."currency" AS "currency",
ST_DistanceSphere(location, ST_GeomFromText('POINT(0.0 0.0)',4326)) AS "distance",
"panel_meals_meal"."id" AS "meal_id",
"panel_meals_meal"."status" AS "meal_status",
"panel_meals_meal"."available_count" AS "available_dishes",
"panel_meals_meal"."discount_price" AS "discount_price",
"panel_meals_meal"."normal_price" AS "normal_price",
"panel_meals_meal"."collection_from" AS "pickup_from",
"panel_meals_meal"."collection_to" AS "pickup_to",
"panel_meals_meal"."description" AS "meal_description"
FROM "panel_restaurants_restaurant"
INNER JOIN "panel_restaurants_restaurantfeatures" ON (
"panel_restaurants_restaurantfeatures"."restaurant_id" = "panel_restaurants_restaurant"."id")
LEFT OUTER JOIN "panel_meals_meal" ON ("panel_restaurants_restaurant"."id" = "panel_meals_meal"."restaurant_id"
AND "panel_meals_meal"."status" = 0
AND (
("panel_meals_meal"."collection_from" AT TIME ZONE 'Europe/Warsaw')::date = DATE 'today' OR
("panel_meals_meal"."collection_from" AT TIME ZONE 'Europe/Warsaw')::date = DATE 'tomorrow'
)
AND "panel_meals_meal"."collection_to" > '2017-07-29 19:33:47.992075+00:00'
AND "panel_meals_meal"."available_count" > 0)
WHERE "panel_restaurants_restaurant"."status" = 2
UNION
SELECT "panel_restaurants_restaurant"."id",
"panel_restaurants_restaurant"."name",
"panel_restaurants_restaurant"."logo",
"panel_restaurants_restaurantfeatures"."currency" AS "currency",
ST_DistanceSphere(location, ST_GeomFromText('POINT(0.0 0.0)',4326)) AS "distance",
"panel_meals_meal"."id" AS "meal_id",
"panel_meals_meal"."status" AS "meal_status",
"panel_meals_meal"."initial_count" AS "available_dishes",
"panel_meals_meal"."discount_price" AS "discount_price",
"panel_meals_meal"."normal_price" AS "normal_price",
"panel_meals_meal"."collection_from" AS "pickup_from",
"panel_meals_meal"."collection_to" AS "pickup_to",
"panel_meals_meal"."description" AS "meal_description"
FROM "panel_restaurants_restaurant"
INNER JOIN "panel_restaurants_restaurantfeatures" ON (
"panel_restaurants_restaurantfeatures"."restaurant_id" = "panel_restaurants_restaurant"."id")
LEFT OUTER JOIN "panel_meals_meal" ON (
"panel_restaurants_restaurant"."id" = "panel_meals_meal"."restaurant_id" AND
"panel_meals_meal"."status" = 0)
INNER JOIN "panel_meals_mealrepeater" ON (
"panel_meals_mealrepeater"."meal_id" = "panel_meals_meal"."id")
WHERE "panel_restaurants_restaurant"."status" = 2 AND "panel_meals_mealrepeater"."saturday" = true
ORDER BY distance ASC
Zum Beispiel - die erste Abfrage nulls für zurückgeben kann, was kommt aus dem panel_meals_meal
Tisch, aber der zweite wird etwas zurückgeben - in dieser Situation werde ich die gleichen Werte für id
, name
, logo
, currency
, distance
und verschiedene Werte (Nullen von der ersten Abfrage zurückgegeben, und something
von der anderen) für alle anderen.
Also die Frage ist - wie mache ich diese UNION
deutlich auf einen bestimmten Bereich von Spalten (eigentlich würde nur einer ausreichen - id
)?
Es Art funktioniert, aber es aufgedeckt ein anderes unerwartetes Verhalten. Nun, wenn beide return Daten auswählen, dann enthält das Ergebnis Duplikate :( –
Nein, mit diesem Szenario, sie nicht tun, das ist durch die 'JOIN ... VERWENDUNG (ID)'. Sehen Sie sich das Beispiel, tun Sie keine Duplikate für "id", auch wenn einige von ihnen in beiden Tabellen sind. – joanolo
Ich weiß es nicht, vielleicht liegt das daran, dass Sie in Ihrem Beispiel zwei separate Tabellen verwenden, und ich wähle dasselbe aus, aber meine Ergebnismenge enthält Duplikate. –