Wat is de gemakkelijkste manier om gegevens uit twee tabellen te selecteren en ze in plaats van ze samen te voegen, als afzonderlijke rijen te laten verschijnen. Beide tabellen hebben vergelijkbare of overeenkomende velden en ik wil er een statistische functie op uitvoeren, zoals het gemiddelde van alle rijen die zich in dezelfde maand hebben voorgedaan, van beide tabellen.
Ik heb bijvoorbeeld twee tabellen, een met transacties van het ene systeem en een andere met transacties van een ander systeem. Is er een manier om alle transacties van beide tabellen als afzonderlijke rijen te pakken? als tabel 1 twintig records heeft en tabel 2 dertig records, dan zou ik graag 50 rijen op de return willen hebben.
Antwoord 1, autoriteit 100%
Je zou zoiets als dit kunnen proberen:
SELECT ...
FROM (
SELECT f1,f2,f3 FROM table1
UNION
SELECT f1,f2,f3 FROM table2
)
WHERE ...
Antwoord 2, autoriteit 64%
De operator UNION ALL
is misschien wat u zoekt.
Met deze operator kunt u de resultatensets van meerdere query’s samenvoegen, waarbij alle rijen van elke query behouden blijven. Merk op dat een operator UNION
(zonder het trefwoord ALL
) alle “dubbele” rijen in de resultatenset zal verwijderen. De operator UNION ALL
bewaart alle rijen van elke query (en zal waarschijnlijk beter presteren omdat het niet de overhead heeft van het uitvoeren van de duplicaatcontrole en verwijderingsbewerking).
Het aantal kolommen en het gegevenstype van elke kolom moet overeenkomen in elk van de query’s. Als een van de query’s meer kolommen heeft dan de andere, nemen we soms dummy-expressies op in de andere query om ervoor te zorgen dat de kolommen en gegevenstypen “overeenkomen”. Vaak is het handig om een expressie (een extra kolom) op te nemen in de SELECT-lijst van elke query die een letterlijke waarde retourneert, om te zien welke van de query’s de “bron” van de rij was.
SELECT 'q1' AS source, a, b, c, d FROM t1 WHERE ...
UNION ALL
SELECT 'q2', t2.fee, t2.fi, t2.fo, 'fum' FROM t2 JOIN t3 ON ...
UNION ALL
SELECT 'q3', '1', '2', buckle, my_shoe FROM t4
Je kunt een query als deze tussen haakjes plaatsen en deze gebruiken als een inline-weergave (of “afgeleide tabel”, in MySQL-jargon), zodat je aggregatiebewerkingen op alle rijen kunt uitvoeren.
p>
SELECT t.a
, SUM(t.b)
, AVG(t.c)
FROM (
SELECT 'q1' AS source, a, b, c, d FROM t1
UNION ALL
SELECT 'q2', t2.fee, t2.fi, t2.fo, 'fum' FROM t2
) t
GROUP BY t.a
ORDER BY t.a
Antwoord 3, autoriteit 54%
Je zou deze notatie kunnen proberen:
SELECT * from table1,table2
Meer gecompliceerde:
SELECT table1.field1,table1.field2, table2.field3,table2.field8 from table1,table2 where table1.field2 = something and table2.field3 = somethingelse
Antwoord 4, autoriteit 16%
Als je vraag dit was — Selecteer ename, dname FROM emp, dept zonder joins te gebruiken..
Dan zou ik dit doen…
SELECT ename, (SELECT dname
FROM dept
WHERE dept.deptno=emp.deptno)dname
FROM EMP
Uitvoer:
ENAME DNAME
---------- --------------
SMITH RESEARCH
ALLEN SALES
WARD SALES
JONES RESEARCH
MARTIN SALES
BLAKE SALES
CLARK ACCOUNTING
SCOTT RESEARCH
KING ACCOUNTING
TURNER SALES
ADAMS RESEARCH
ENAME DNAME
---------- --------------
JAMES SALES
FORD RESEARCH
MILLER ACCOUNTING
14 rows selected.
Antwoord 5, autoriteit 9%
Je zou dit eens moeten proberen
SELECT t1.*,t2.* FROM t1,t2
Antwoord 6
Union haalt gegevens op per rij en niet per kolom, dus als u net als ik zoekt naar het ophalen van kolomgegevens uit twee verschillende tabellen zonder relatie en zonder join.
In mijn geval haal ik de naam van de staat en het land op met id. In plaats van twee query’s te schrijven, kunt u dit op deze manier doen.
select
(
select s.state_name from state s where s.state_id=3
) statename,
(
select c.description from country c where c.id=5
) countryname
from dual;
waarbij dual een dummy-tabel is met een enkele kolom – alles heeft alleen een tabel nodig om te bekijken
Antwoord 7
selecteer ‘test’, (selecteer naam van werknemer waar id=1) als naam, (selecteer naam van adres waar id=2) als adres ;
Antwoord 8
In dit geval gaan we ervan uit dat we twee tabellen hebben:
SMPPMsgLog
en SMSService
met gemeenschappelijke kolom serviceid
:
SELECT sp.SMS,ss.CMD
FROM vas.SMPPMsgLog AS sp,vas.SMSService AS ss
WHERE sp.serviceid=5431
AND ss.ServiceID = 5431
AND Receiver ="232700000"
AND date(TimeStamp) <='2013-08-07'
AND date(TimeStamp) >='2013-08-06' \G;