2016-04-03 1 views
0

Ich habe meinen tatsächlichen Live-Code vereinfacht, da ich diesen Beitrag mit irrelevanten Daten nicht überlaufen möchte.Links Joins auf mehreren Tabellen, wo einer von ihnen Master sein kann

Ich habe (leider) sieben Tabellen, eine für jeden Wochentag, die genau die gleichen Informationen enthält, mit Ausnahme von zwei Artikeln und das ist der Titel der Zeitung und die Menge an Zeitungen, die der Kunde erhalten sollte. Jetzt kann jeder Kunde eine beliebige Anzahl von Zeitungen haben (von einem einzigen Titel bis hin zu 20 verschiedenen Titeln) und sie können jeden Tag eine beliebige Anzahl von Zeitungen mit diesem Titel haben (0 zu riesigen Mengen) - ABER! und hier kommt der Kicker - sie können die Menge von 0 an jedem gegebenen Tag haben. Was ich am Ende brauche, ist dies:

Customer1, New York Times, 0, 7, 3, 2, 2, 10, 10 

was darauf hindeuten würde, dass Customer1 7 in New York TIEMS am Dienstag will (ja, ich bin aus Schweden, wird die Woche mit Montag beginnen), 10 am Samstag und 10 am Sonntag e.tc. Nun meine 7 verschiedene Tabellen habe ich nun keine Informationen überhaupt enthalten, wenn der Kunde an diesem bestimmten Tag keine Papiere haben nicht, was bedeutet, dass ich das nicht tun kann:

select t1.name, t1.title, t1.amount, t2.amount, 
      t3.amount, t4.amount, t5.amount, t6.amount, 
      t7.amount 
    from table_mon t1 
    left join table_tue t2 on t2.name = t1.name 
    left join table_wen t3 on t3.name = t1.name 
    left join table_thu t4 on t4.name = t1.name 
    left join table_fri t5 on t5.name = t1.name 
    left join table_sat t6 on t6.name = t1.name 
    left join table_sun t7 on t7.name = t1.name 

seit Montag der Tag sein könnte dass dieser Kunde kein Papier hat und somit nicht zum montag gehört. Theoretisch kann er nur in einem der Tische sein und ich habe keine Ahnung welche.

Wie kann ich eine Verknüpfung schreiben, wo ich nicht weiß, welche die "Master" -Tabelle ist?

+0

Dies scheint eine schlechtes Datenbankdesign Ist es zu spät, um zu ändern? –

+0

Sollte der Join nicht auch die Titelspalte enthalten? –

Antwort

1

Sie müssen nicht wirklich wissen, welches die Tabelle master ist, die Sie UNION ALL verwenden können, um dies in einem einzigen Ergebnis oder einer abgeleiteten Tabelle zu kombinieren.

SELECT name, title, SUM(MON), SUM(TUE), SUM(WED), SUM(THU) 
FROM 
(
    SELECT name, title, amount as MON, NULL as TUE, NULL as WED, NULL as THU, . . . 
    FROM table_mon 
    UNION ALL 
    SELECT name, title, NULL as MON, amount as TUE, NULL as WED, NULL as THU, . . . 
    FROM table_tue 
    UNION ALL 
    SELECT name, title, NULL as MON, NULL as TUE, amount as WED, NULL as THU, . . . 
    FROM table_wed 
) d 
GROUP BY name, title 
+0

Leider bekomme ich dieses Ergebnis dann: 'Kunde1, New York Times, 1, 0, 0, 0, 0, 0, 0' und zweite Reihe' Kunde1, New York Times, 0, 1, 0, 0, 0, 0 , 0' und so weiter ... –

+0

AHA! Ich hatte auch eine Datumskomponente in meinen Live-Tabellen, die es für mich versaut hat. Ich werde das nicht mitnehmen und es wird alles gut werden. –

1
select name, title, 
     sum(a1) mon, sum(a2) tue, sum(a3) wed, sum(a4) thu, sum(a5) fri, 
     sum(a6) sat, sum(a7) sun from (
    select name,title,amount a1,0 a2,0 a3,0 a4,0 a5,0 a6,0 a7 FROM table_mon union all 
    select name,title,0,amount,0,0,0,0,0 FROM table_tue union all 
    select name,title,0,0,amount,0,0,0,0 FROM table_wed union all 
    select name,title,0,0,0,amount,0,0,0 FROM table_thu union all 
    select name,title,0,0,0,0,amount,0,0 FROM table_fri union all 
    select name,title,0,0,0,0,0,amount,0 FROM table_sat union all 
    select name,title,0,0,0,0,0,0,amount FROM table_sun 
) week 
group by name,title 

Ja, hat Eichhörnchen mich zu ihm geschlagen. Ich war einfach zu langsam. Ich hätte nicht zehn Minuten lang versuchen sollen, meine Antwort auf einem schwachen Android-Handy zu bearbeiten ;-).

Aber, wie schon gesagt, freakyhat, und wie man sich von der abgeleiteten Tabelle in meiner Lösung sehen kann, wäre es eine gute Idee, alle in den Wert speichern ein Tisch ...

+0

Ich hatte einige Probleme mit dieser Lösung, aber es war, weil ich eine DATE-Spalte in meinen Live-Tabellen hatte, so dass das Entfernen funktioniert hat! (Siehe Kommentare zum Eichhörnchen-Hinweis unten) –

Verwandte Themen