<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://sqlserver.ro/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Intrebari generale</title><link>http://sqlserver.ro/forums/16/ShowForum.aspx</link><description /><dc:language>en</dc:language><generator>CommunityServer 2.1 SP2 (Build: 61129.1)</generator><item><title>Re: Join cu doar primul rand din tabela</title><link>http://sqlserver.ro/forums/thread/5549.aspx</link><pubDate>Tue, 02 Sep 2008 06:09:58 GMT</pubDate><guid isPermaLink="false">963f3a18-65dd-4aad-905c-b785cfe1d7c7:5549</guid><dc:creator>rsocol</dc:creator><slash:comments>0</slash:comments><comments>http://sqlserver.ro/forums/thread/5549.aspx</comments><wfw:commentRss>http://sqlserver.ro/forums/commentrss.aspx?SectionID=16&amp;PostID=5549</wfw:commentRss><description>Dar hai să complicăm puţin problema şi să presupunem că ai mai multe coloane în tabela B:&lt;br&gt;&lt;br&gt;CREATE TABLE A (&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ID_A int PRIMARY KEY,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; A1 varchar(10),&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; A2 varchar(10)&lt;br&gt;)&lt;br&gt;&lt;br&gt;CREATE TABLE B (&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ID_B int PRIMARY KEY,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ID_A int NOT NULL REFERENCES A,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; B1 varchar(10),&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; B2 varchar(10)&lt;br&gt;)&lt;br&gt;&lt;br&gt;INSERT INTO A VALUES (1, 'X1', 'Y1')&lt;br&gt;INSERT INTO A VALUES (2, 'X2', 'Y2')&lt;br&gt;INSERT INTO A VALUES (3, 'X3', 'Y3')&lt;br&gt;&lt;br&gt;INSERT INTO B VALUES (1, 1, 'ABC', '321')&lt;br&gt;INSERT INTO B VALUES (4, 2, 'ABC', '321')&lt;br&gt;INSERT INTO B VALUES (2, 2, 'BBB', '222')&lt;br&gt;INSERT INTO B VALUES (3, 2, 'AAA', '333')&lt;br&gt;&lt;br&gt;În acest caz, să presupunem că rezultatul dorit ar fi:&lt;br&gt;&lt;br&gt;ID_A&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; A1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; A2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; B1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; B2&lt;br&gt;----------- ---------- ---------- ---------- ----------&lt;br&gt;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; X1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Y1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ABC&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 321&lt;br&gt;2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; X2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Y2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AAA&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 333&lt;br&gt;3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; X3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Y3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NULL&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NULL&lt;br&gt;4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; X4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Y4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CCC&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 123&lt;br&gt;&lt;br&gt;(adică pentru fiecare rând din A, dorim primul rând din B, în ordinea dată de B1 şi B2)&lt;br&gt;&lt;br&gt;Dacă modificăm primul query de mai sus, astfel:&lt;br&gt;&lt;br&gt;SELECT A.*, &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (SELECT MIN(B1) FROM B WHERE B.ID_A=A.ID_A) B1,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (SELECT MIN(B2) FROM B WHERE B.ID_A=A.ID_A) B2&lt;br&gt;FROM A&lt;br&gt;&lt;br&gt;atunci obţinem alt rezultat:&lt;br&gt;&lt;br&gt;ID_A&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; A1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; A2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; B1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; B2&lt;br&gt;----------- ---------- ---------- ---------- ----------&lt;br&gt;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; X1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Y1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ABC&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 321&lt;br&gt;2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; X2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Y2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AAA&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;222&lt;/b&gt;&lt;br&gt;3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; X3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Y3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NULL&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NULL&lt;br&gt;4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; X4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Y4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CCC&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 123&lt;br&gt;&lt;br&gt;pentru că la rândul cu ID_A=2 s-a luat cel mai mic B2, în loc să se ia B2-ul corespunzător rândului cu cel mai mic B1.&lt;br&gt;&lt;br&gt;Putem obţine rezultatul dorit cu unul din următoarele query-uri:&lt;br&gt;&lt;br&gt;SELECT X.*, &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (SELECT MIN(B2) FROM B WHERE B.ID_A=X.ID_A AND B.B1=X.B1) B2&lt;br&gt;FROM (&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT A.*,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; (SELECT MIN(B1) FROM B WHERE B.ID_A=A.ID_A) B1&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM A&lt;br&gt;) X&lt;br&gt;&lt;br&gt;SELECT A.*, B.B1, B.B2 FROM A LEFT JOIN B ON A.ID_A=B.ID_A&lt;br&gt;AND B.ID_B=(&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT TOP 1 ID_B FROM B WHERE A.ID_A=B.ID_A&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ORDER BY B1, B2&lt;br&gt;)&lt;br&gt;&lt;br&gt;SELECT X.ID_A, X.A1, X.A2, B.B1, B.B2 FROM (&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT A.*, (&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT TOP 1 ID_B FROM B WHERE A.ID_A=B.ID_A&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ORDER BY B1, B2&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ) ID_B&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM A&lt;br&gt;) X LEFT JOIN B ON X.ID_B=B.ID_B&lt;br&gt;&lt;br&gt;SELECT A.*, X.B1, X.B2 FROM A LEFT JOIN (&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT B.*, ROW_NUMBER() OVER (PARTITION BY ID_A ORDER BY B1,B2) N&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM B&lt;br&gt;) X ON A.ID_A=X.ID_A AND X.N=1;&lt;br&gt;&lt;br&gt;Răzvan&lt;br&gt;</description></item><item><title>Re: Join cu doar primul rand din tabela</title><link>http://sqlserver.ro/forums/thread/5548.aspx</link><pubDate>Tue, 02 Sep 2008 05:52:20 GMT</pubDate><guid isPermaLink="false">963f3a18-65dd-4aad-905c-b785cfe1d7c7:5548</guid><dc:creator>rsocol</dc:creator><slash:comments>0</slash:comments><comments>http://sqlserver.ro/forums/thread/5548.aspx</comments><wfw:commentRss>http://sqlserver.ro/forums/commentrss.aspx?SectionID=16&amp;PostID=5548</wfw:commentRss><description>Când ai o problemă de acest gen, e recomandabil să prezinţi structura tabelelor (sub formă de CREATE TABLE, inclusiv constraint-urile aferente) şi date de test (sub formă de INSERT INTO), de exemplu:&lt;br&gt;&lt;br&gt;CREATE TABLE A (&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ID_A int PRIMARY KEY,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; A1 varchar(10),&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; A2 varchar(10)&lt;br&gt;)&lt;br&gt;&lt;br&gt;CREATE TABLE B (&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ID_B int PRIMARY KEY,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ID_A int NOT NULL REFERENCES IA,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; B1 varchar(10)&lt;br&gt;)&lt;br&gt;&lt;br&gt;INSERT INTO A VALUES (1, 'X1', 'Y1')&lt;br&gt;INSERT INTO A VALUES (2, 'X2', 'Y2')&lt;br&gt;INSERT INTO A VALUES (3, 'X3', 'Y3')&lt;br&gt;&lt;br&gt;INSERT INTO B VALUES (1, 1, 'ABC')&lt;br&gt;INSERT INTO B VALUES (4, 2, 'ABC')&lt;br&gt;INSERT INTO B VALUES (2, 2, 'BBB')&lt;br&gt;INSERT INTO B VALUES (3, 2, 'AAA')&lt;br&gt;&lt;br&gt;Atunci când spui "primul rând din tabela B" trebuie să precizezi în ce ordine vrei să consideri rândurile respective, deoarece rândurile dintr-o tabelă nu au o ordine predefinită (nu contează ordinea în care au fost adăugate). Presupunând că ordinea dorită este dată de coloana B1, rezultatul aşteptat ar putea fi următorul:&lt;br&gt;&lt;br&gt;ID_A&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; A1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; A2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; B1&lt;br&gt;----------- ---------- ---------- ----------&lt;br&gt;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; X1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Y1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ABC&lt;br&gt;2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; X2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Y2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AAA&lt;br&gt;3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; X3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Y3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NULL&lt;br&gt;&lt;br&gt;Rezultatul de mai sus poate fi obţinut cu oricare din următoarele query-uri:&lt;br&gt;&lt;br&gt;SELECT A.*, (SELECT MIN(B1) FROM B WHERE B.ID_A=A.ID_A) B1 FROM A;&lt;br&gt;&lt;br&gt;SELECT A.*, (SELECT TOP 1 B1 FROM B WHERE B.ID_A=A.ID_A ORDER BY B1) B1 FROM A;&lt;br&gt;&lt;br&gt;SELECT A.*, MIN(B1) AS B1&lt;br&gt;FROM A LEFT JOIN B ON B.ID_A=A.ID_A&lt;br&gt;GROUP BY A.ID_A, A1, A2;&lt;br&gt;&lt;br&gt;SELECT A.*, X.B1 FROM A LEFT JOIN (&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT ID_A, MIN(B1) B1 FROM B&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; GROUP BY ID_A&lt;br&gt;) X ON A.ID_A=X.ID_A;&lt;br&gt;&lt;br&gt;SELECT A.*, X.B1 FROM A LEFT JOIN (&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT B.*, ROW_NUMBER() OVER (PARTITION BY ID_A ORDER BY B1) N&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM B&lt;br&gt;) X ON A.ID_A=X.ID_A AND X.N=1;&lt;br&gt;&lt;br&gt;WITH X AS (&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT B.*, ROW_NUMBER() OVER (PARTITION BY ID_A ORDER BY B1) N&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM B&lt;br&gt;)&lt;br&gt;SELECT A.*, X.B1 FROM A LEFT JOIN X ON A.ID_A=X.ID_A AND X.N=1&lt;br&gt;&lt;br&gt;Răzvan&lt;br&gt;</description></item><item><title>Join cu doar primul rand din tabela</title><link>http://sqlserver.ro/forums/thread/5547.aspx</link><pubDate>Mon, 01 Sep 2008 15:08:49 GMT</pubDate><guid isPermaLink="false">963f3a18-65dd-4aad-905c-b785cfe1d7c7:5547</guid><dc:creator>liviu.costea</dc:creator><slash:comments>0</slash:comments><comments>http://sqlserver.ro/forums/thread/5547.aspx</comments><wfw:commentRss>http://sqlserver.ro/forums/commentrss.aspx?SectionID=16&amp;PostID=5547</wfw:commentRss><description>&lt;P&gt;Am o tabela A (id, A1, A2) si o tabela B (id_A, id_B, B1), B&amp;nbsp;fiind legat de A. Vreau sa scot randul din A cu doar primul rand din B. Inainte (SQL 2000)&amp;nbsp;foloseam un subquery cu TOP 1, mai recent (2005) am inceput sa folosesc CTE si ROW_NUMBER().&lt;/P&gt;
&lt;P&gt;Cred ca problema asta a mai fost intalnita si de altcineva, deci voi ce folositi (poate stiti o metoda mai buna)? &lt;img src="http://sqlserver.ro/emoticons/emotion-1.gif" alt="Smile" /&gt;&lt;/P&gt;</description></item></channel></rss>