Lame problem

6 отговора 216 прегледа
#1

Lame problem

hi

опитвам се да направя нещо доста просто, но се занимавам с SQL от съвсем скоро (срам ме е да кажа колко :)) и не мога да се оправя сам

Проблемът е следния:
трябва да се merge-nat 2 таблици по ID

в едната таблица ID-tata са уникални, в другата има "дубликати". пиша го в кавички защото не са *чисти дубликати* а към всеки номер, който е дублиран има добавена буква (М);

въпросът ми е какъв ще да е syntax-a посредством който да слея двете таблици така, че релевантните полета от таблицата с уникалните ID-та да бъдат импортнати към съответстващите им номера от таблицата с *дубликатите*, като в същото време номерата които са с букви също просъстват във финалната таблица, но към тях да няма импортнато нищо (т.е. полетата от другата таблица да са налице и за тях, но в тях да няма нищо).

знам как да постигна това с 2 queries, но се интересувам как може да стане на една стъпка - т.е. да се зададе SELECT, който да произведе таблица в която присъстват всички *дублирани* ID-ta, но информацията от таблицата с уникални ID е импортната само към рекорд-ите които реално match-ват;

предполагам че трябва да се използва някаква инструкция която казва какво да се прави с рекорди с еди какъв си стринг (М) "LEFT on"???, но не знам как да го дефинирам :(

10х

Отговор
в отговор на navlek #2

Re: Lame problem

Za kakyv SQL Server stava duma?

Shto se otnasq na gluposti ot roda na LEFT i drugi podobni parse-vaniq na stringove za da se napravi JOIN na tablici - zabarvi go. Prosto se izsmei grymko i qsno v liceto na choveka, koito go e izmislil tova, preobrazuvai si poleto v standartno ID ( kato prosto mahnesh 'M'-a ot vsichki zapisi ) a ako nqkoi dyrji da vijda ili vyvejda ID-ta s M sled tqh - prosto go napravi shastliv na podhodqshtite vhodno/izhodni mesta.

Отговор
в отговор на navlek #3

Re: Lame problem

Я стига глупости. Няма нищо срамно в това да не разбираш нещо.

Искам обаче да те помоля да си промениш малко терминологията. Доста сложни думички използваш при това повечето от тях хич не са от областта на релационните бази данни.

1. Винаги давай примерчета - много по-лесно е:

Имам таблица t1 (a, b) и таблица t2 (x, y) и искам да ....

2. Какво разбираш под:
трябва да се merge-nat 2 таблици по ID

Искаш да направиш нова таблица от 2-те ли?
Искаш да направиш някакъв JOIN който да комбинира "тия" редове от едната с "ония" от другата ли?
Нещо друго ли?

2. По-добре не използвай никога и за нищо думичката дупликат като говориш за БД само объркване ще създадеш

3. Какво значи:
към всеки номер, който е дублиран има добавена буква (М)

виждаш ли колко е по-просто с примерче?

4. таблицата с уникални ID е импортната само към рекорд-ите които реално match-ват;

ехаааа ми що не го кажеш на малко по-български?

Англиийските думи Record и Match се превеждат съответно като Запис и Съвпадение

Очевидно пристигаш от един друг свят където се говори за по-други бази данни. В SQL е прието да се говори за Таблици, Редове, Колони

"импортнати" обиквонено се използва за зареждане на данни или за прехвърляне от един тип БД към друг но не и за връзка, отношение, релация между две таблици


И накрая след като знаеш как да го направиш с 2 заявки амо просто ги напиши и тях и попитай
- Ха сега как тези двете да ги направя само с една заявка.

След, което ще получиш различни отговори в зависимост от SQL сървъра, който използваш тъй, че няй добре го кажи и него

Linux is like a wigwam - No Windows, No Gates, Apache inside
Отговор
в отговор на lvo #4

Re: Lame problem

А ако човека има предвид LEFT JOIN а не LEFT(..) ?

Иначе си ама съвсем прав ако имаш предвид, че не бива да се слага повече от едно нещо на едно място :)

ЕГН-то примерно е адски глупаво да се държи в този му вид в БД нъл тъй?

Linux is like a wigwam - No Windows, No Gates, Apache inside
Отговор
в отговор на salle #5

Re: Lame problem

оф, и двамата сте прави - т.е. в крайна сметка проблема се реши с LEFT JOIN, но се заблуждавах че мога да задам някакъв критерий който да разпознава М-овете;

инача бачкам в ACCESS; почнах да се уча съвсем наскоро и засега ми е достатъчен pain in the butt :)

Отговор
в отговор на salle #6

Re: Lame problem

> 2. Какво разбираш под:
> трябва да се merge-nat 2 таблици по ID
> Искаш да направиш нова таблица от 2-те ли?
Ами да - най-простия случай с уникални ID-та в двете таблици би бил:

SELECT table1.*, table2.*
FROM table1, table2
WHERE table1.ID = table2.ID

> Искаш да направиш някакъв JOIN който да комбинира "тия" редове от
> едната с "ония" от другата ли?
да, но искам също така и записите които няма с какво да се слеят да присъстват във финалната таблица

> 2. По-добре не използвай никога и за нищо думичката дупликат като
> говориш за БД само объркване ще създадеш
би ли казал малко повече за това? дублираните записи се очертават да са основен проблем с таблиците с които ще се налага да работя? под дублирани записи разбирам едни и същи реални единици на анализ, които могат да се срещат няколко пъти в таблицата, но с различни стойности на съответните полета; например, социо демографски данни за едни и същи градове перз различни години; или конкретния ми проблем: *дублираните* номера съответстват на едни и същи фирми, но данните за тях идват от различни изследвания.


> 3. Какво значи:
> към всеки номер, който е дублиран има добавена буква (М)
всички номера без букви са уникални; обаче, в таблицата така както имам *123*, имам и *М123*

> 4. таблицата с уникални ID е импортната само към рекорд-ите които реално > match-ват;
> ехаааа ми що не го кажеш на малко по-български?
;-))); ми идеята беше че искам всички номера да присъстват във виналната таблица (т.е. 123 и М123), като полетата от другата таблица са вкарани само в 123.

това което предлага ivo e първото възможно решение на проблема - т.е. правя нова колона, копирам оригиналните ID-та, разкарвам М-овете и с един обикновен селект получавам таблица в която М123 например се интерпретира като 123 и информацията за записа съответстващ на 123 е асоциирана и с *бившия* М123. Това е ок и решава проблема ако наистина разликата между въпросните фирми е че са от различни изследвания.

ако това обаче са И различни фирми, то ми трябва втората опция: тези записи присъстват във финалната таблица, но към тях не са вкарани стойности на полетата асоциирани с номерата без букви.

оказа се, че има доста елегантно решение на този проблем (10х yavora!), с помощта на convert string:

SELECT table1.*, table2.*
FROM table1 LEFT JOIN table2 ON
table1.ID=cstr(table2.ID);

т.е. в това сливане се използва оригиналната колона *ID*-та в която има номера и номера с букви; т.е. това convert-va номерата от таблицата с нормални ID-ta ги match-va към колоната където има както номера, така и номера с букви; в резултат произвежда точно това което се иска:

cust.TechID field1 field2 man.ID

123 45 1 123
M123 56
125 65 3 125
M125 55



игаси колко много шум за нищо

Отговор
в отговор на lvo #7

Re: Lame problem

а, тфа е отделен въпрос - чуковете за които работя дори не могат да си дефинират проблема и освен това са твърдо убедени че *трябва* да има повече от въпросните два възможни начина да се изпълни сливането ; ако можеше и малко изкуствен интелект да си върви с таблицата най-щяха да се кефят

Отговор