Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Left Join если в одной из таблиц несколько значений в ячейки

Доброго времени суток. Вопрос.

Есть две таблицы в каждой есть по столбцу Card_ID. Соединяем их через Left Join. Есть проблема. В одной из таблиц в ячейках Card_ID встречаются двойные/тройные ID-шники, записанные через запятую. И Left Join их не видит из-за этого и не подливает.

Есть способ при котором можно соединить такие данные?
Ответ: qwertehok, как это сделать?
Я могу разбить строку используя признак запятой.

Но после этого нужно что бы разбитые значения приняли соответсвующее значение "цены" и других значений в строке.

Было
12,00р. 000001, 000013, 000026

Стало

12,00р. 000001
12,00р. 000013
12,00р. 000026
Вопрос: Условие в Left Join VS Where

Имеем запрос:
Select count(*),
                    NVL(sum(case when NVL(s.serno, 0) > 0 then 1 else 0 end),0),
                    NVL(sum(case when NVL(s.status, 'XXXX') in ('S2NT') then 1 else 0 end),0),
                    NVL(sum(case when NVL(s.status, 'XXXX') in ('FAIL') then 1 else 0 end),0),
                    NVL(sum(case when NVL(s.status, 'XXXX') in ('SUCC', 'FAIL') then 1 else 0 end),0),
                    NVL(sum(case when NVL(s.status, 'XXXX') = 'SUCC' and s.authserno > 0 then 1 else 0 end),0)
               from ctransactions t
               left outer join interfacerecordstatus s on t.serno = s.rowserno and s.partitionkey = t.partitionkey and s.recordtype = 'TRXN' and s.systemname = 'online' and s.systemtype = 'O'
              where t.batchserno = 321356
                and t.stgeneral = 'POST'
                


Он аццки тормозит, независимо от того хинтую я индексы или нет. Но вот если перенести часть условия в Where то он начинает летать хотьв пане запроса идет Full Scan по interfacerecordstatus
Что за ерунда? Надо статистику индексов пересобрать? Таблицы партицированные.

Этот летает:
Select count(*),
                    NVL(sum(case when NVL(s.serno, 0) > 0 then 1 else 0 end),0),
                    NVL(sum(case when NVL(s.status, 'XXXX') in ('S2NT') then 1 else 0 end),0),
                    NVL(sum(case when NVL(s.status, 'XXXX') in ('FAIL') then 1 else 0 end),0),
                    NVL(sum(case when NVL(s.status, 'XXXX') in ('SUCC', 'FAIL') then 1 else 0 end),0),
                    NVL(sum(case when NVL(s.status, 'XXXX') = 'SUCC' and s.authserno > 0 then 1 else 0 end),0)
               from ctransactions t
               left outer join interfacerecordstatus s on t.serno = s.rowserno and s.partitionkey = t.partitionkey
              where t.batchserno = 321356
                and t.stgeneral = 'POST'
                and s.recordtype = 'TRXN' and s.systemname = 'online' and s.systemtype = 'O'
                
Ответ:
SY

В oбщем случае это не эквивалентно:


Ты можешь использовать NVL если поля s.recordtype, s.systemname и s.systemtype определены как NOT NULL:

Select count(*),
                    NVL(sum(case when NVL(s.serno, 0) > 0 then 1 else 0 end),0),
                    NVL(sum(case when NVL(s.status, 'XXXX') in ('S2NT') then 1 else 0 end),0),
                    NVL(sum(case when NVL(s.status, 'XXXX') in ('FAIL') then 1 else 0 end),0),
                    NVL(sum(case when NVL(s.status, 'XXXX') in ('SUCC', 'FAIL') then 1 else 0 end),0),
                    NVL(sum(case when NVL(s.status, 'XXXX') = 'SUCC' and s.authserno > 0 then 1 else 0 end),0)
               from ctransactions t
               left outer join interfacerecordstatus s on t.serno = s.rowserno and s.partitionkey = t.partitionkey
              where t.batchserno = 321356
                and t.stgeneral = 'POST'
                and nvl(s.recordtype,'TRXN') = 'TRXN' and nvl(s.systemname,'online') = 'online' and nvl(s.systemtype,'O') = 'O'


SY.
Вопрос: Снова про JOIN

Товарисчи!
Возник вопрос:
1) Есть таблица юзеров users

idname

у каждого юзера есть айдишник и имя

2) Есть таблица задач issues

idnameauthor_idassigned_to_id

у которой есть айдишник, название, и ещё два поля - author_id - кто автор (ссылка на айдишник юзера) и assigned_to_id - на кого назначена (ссылка на айдишник юзера)

предположим, мне надо вытащить в резудьтате запроса имя автора и исполнителя, правильно ли будет сделать такой запрос

select i.id, i.name, author.name, assigned.name from issues as i
join issues as author
  on i.author_id = author.id
join issues as assigned
  on i.assigned_to_id = assigned_to.id
where i.id = 1


или делать два джоина это не правильно, и можно сделать как нибудь ещё?
Ответ:
grufos
для pivot функционала в postgres есть расширение
Поделку через текстуализацию sql, если бы не известность автора, приняли бы за студенческую лабораторную работу и в дистрибутив не включили. Впрочем, postgresql и без этого хромой на позднее связывание в погоне за чужими фичами.
Вопрос: Подскажите как сделать множественный join

Я пользуюсь фреймворком в нем эктив рекордс такого плана
$this->db->select('*');
$this->db->from('blogs');
$this->db->join('comments', 'comments.id = blogs.id');

$query = $this->db->get();

// Генерирует:
// SELECT * FROM blogs
// JOIN comments ON comments.id = blogs.id
Но я помыслил так же получить данные и из других таблиц и написал сдедующее
$join_array[0]=array('table'=>'pages','column'=>'pages.page_type=page_types.id');
	$join_array[1]=array('table'=>'pages','column'=>'pages.layout=layouts.id');
	$join_array[2]=array('table'=>'pages','column'=>'pages.author=authors.id');
	$data['content']=$this->table_model->get_join($table[0]['name_table'],null,null,$join_array);

public function get_join($table,$id_key,$obj_id,$join_array){
	if(!$table){
	$table=$this->table;
	}
	$this->db->from($table);
    if(!$id_key){
	$id_key=$this->id_key;
	}
	if($id_key and $obj_id){
	$this->db->where($id_key,$obj_id);
	}
	foreach($join_array as $key=>$val){
	$this->db->join($val['table'],$val['column']);
	}
	$query=$this->db->get();
	return $query->result_array();
	}

Но получил вот такую реакцию
Not unique table/alias: 'pages'

SELECT * FROM (`pages`) JOIN `pages` ON `pages`.`page_type`=`page_types`.`id` JOIN `pages` ON `pages`.`layout`=`layouts`.`id` JOIN `pages` ON `pages`.`author`=`authors`.`id`

Как сделать этот множественный join
Ответ:
imediasun
да сформулируйте пожалуйста ввиде запроса sql
Вероятно, как-то так:
SELECT *
FROM `pages`
  JOIN `page_types` ON `pages`.`page_type`=`page_types`.`id`
  JOIN `layouts` ON `pages`.`layout`=`layouts`.`id`
  JOIN `authors` ON `pages`.`author`=`authors`.`id`
Но насколько это соответствует желаемому результат - не знаю.
Вопрос: Сколько раз можно сделать LEFT JOIN (сраННый вопрос)

Доброго дня господа !

Возникла проблема

select  A.*
  from <Основная таблица> A
    left join <[b]Таблица 2= 50 записей[/b]> B
     on  (B.F0='B' and B.F1=A.F1)
    .......................................... 
    .......................................... 
    .......................................... 
    left join <[b]Таблица 2= 50 записей[/b]> С
     on  (C.F0='C' and C.F1=A.F1)

Запрос работает нормально

На седьмом использовании Left-а крокозябримо план оптимизации
зависло выполнение.
Left join неоднократно присоединял одну и туже таблицу (но с разными ключами)


select  A.*
  from <Основная таблица> A
    left join <[b]Таблица 2= 50 записей[/b]> B
     on  (B.F0='B' and B.F1=A.F1)
    .......................................... 
    .......................................... 
    .......................................... 
    left join <[b]Таблица 2= 50 записей[/b]> С
     on  (C.F0='C' and C.F1=A.F1)

    left join <[b]Таблица 2= 50 записей[/b]> D
     on  (D.F0='D' and D.F1=A.F1)


Кто-то сталкивался с таким, как побороть ...

Заранее благодарен !
Ответ: HOME_X,

"И потом Case значение по полям в секции SELECT.... ? реализация будет громоздка (если выхода не будет)" - у тебя конечно не громоздкие 7 лефтджоинов... они то намного проще чем 1лефт джоин +pivot +case
P.S.
в очередной раз убеждаюсь что у меня всегда будет работа.... даже если каждый год будет появляться 100 гениев, на хлеб с красной икрой мне точно хватит, если человек с 2умя тысячами сообщений не понимает что пишет говнокод.
Вопрос: выбрать строки если есть с непустым полем или с пустым если нет

Есть список тарифов, и среди них есть индивидуальные для контрагента, это определяется полем с его id. Так вот надо выбрать тарифы так, чтобы если есть индивидуальный (с его id) то выбрало его, а общий не выбирало, но если нет индивидуального то выбрать общий (с пустым id).

таблица с тарифами упрощенно:
откуда город (int)
куда город (int)
название тарифа (varchar)
способ доставки (varchar)
id контрагента (id|null)

Таким образом, в конце первые 4 поля не должны быть выбраны в одинаковом сочетании 2 раза. Можно ли это сделать без вложенных запросов, и если нет то как с вложенным попроще.
Ответ: Ну типа
SELECT ab.abonent, coalesce(ind.tariff, korp.tariff) tariff
FROM abonents ab
LEFT JOIN tariffs ind ON ab.id = ind.abonent_id AND town_from  = @from AND town_to = @to
LEFT JOIN tariffs korp ON korp.abonent_is IS NULL AND town_from  = @from AND town_to = @to
Вопрос: Подскажите как сделать запрос

Подскажите как сделать пункты 5 и 6. (представлены на скриншоте). В 6 пункте вообще не понимаю принципа выборки. новичок в SQl
P.s можно и все,хотелось бы сверить со своими,правильно ли делаю
Ответ:
Сообщение от Sashabk201
в статье опять же про объединение 2-х таблиц... как делать с 3 - мя ... и более
Ты можешь объединять сколько угодно таблиц.
Код SQL
1
2
3
4
5
6
SELECT *
FROM table1 
INNER JOIN table2 ON ....
INNER JOIN table3 ON ....
.......
INNER JOIN tableN ON .......
и естественно вместо inner join можешь применять необходимую конструкцию
Вопрос: Как можно сделать SQL запрос к двум базам Access из Делфи

Подскажите, пожалуйста, как можно сделать SQL запрос к двум базам Access из Делфи одновременно. Не понимаю как в один ADOQuery "впихнуть" вторую базу и выбрать из нее значения по соответсвующим полям из результата запроса к первой.
Буду признателен за подсказки/примеры.
Ответ: Сделал такой запрос

         qry_SQL.SQL.Add('select Seconds from SutvValueTable  ' );
         qry_SQL.SQL.Add ('INNER JOIN DataTable IN "Q:\Systel\Bin\Zerver.mdb"  ');
         qry_SQL.SQL.Add ('ON SutvValueTable.RegionIndex= DataTable.RegionIndex  ');
         qry_SQL.SQL.Add('AND SutvValueTable.DataIndex= DataTable.DataIndex  ');
         qry_SQL.SQL.Add (' where Seconds= (SELECT max(Seconds ) From SutvValueTable)  ');
         qry_SQL.SQL.Add('and (Status> 4095) and (Status< 8092) and (Status mod 2 = 0)  ');


Синтаксическая ошибка. Что тут не так? Может, надо как-то указать полный путь к базе в строках 2 и 3?
Также в первой строке хочу указать поле из DataTable. Но тоже не совсем понятно, с полным путем указывать или как?
Подскажите, кто может, плиз....
Вопрос: DEFAULT значение для JOIN если отсутствуют соответствующие строки

Добрый день!

Есть такие данные:
CREATE TABLE "models" (
"_id" INTEGER PRIMARY KEY  NOT NULL ,
"name" TEXT NOT NULL  DEFAULT (null) ,
"price" INTEGER NOT NULL )


INSERT INTO "models" VALUES(1,'BMW',55000);
INSERT INTO "models" VALUES(2,'AUDI',62000);
INSERT INTO "models" VALUES(3,'OPEL',42000);
INSERT INTO "models" VALUES(4,'MERCEDES',72000);


CREATE TABLE "properties" (
"_id" INTEGER PRIMARY KEY  NOT NULL , 
"model_id" INTEGER NOT NULL , 
"quantity" INTEGER NOT NULL  DEFAULT 0, 
"year" INTEGER DEFAULT 0)


INSERT INTO "properties" VALUES(1,2,5,2010);
INSERT INTO "properties" VALUES(2,4,9,2012);


Хочу получить такую сводную таблицу:

_idnamepricequantityyear
1BMW5500000
2AUDI6200052010
3OPEL4200000
4MERCEDES7200092012


Если в таблице "properties" отсутствуют строки для соответствующей из "models" использовать для столбцов "quantity" и "year" значение по умолчанию - "0".

Делаю так:
SELECT models._id, name, price, quantity, year FROM models JOIN properties ON models._id=model_id


Получаю:
_idnamepricequantityyear
2AUDI6200052010
4MERCEDES7200092012


Прошу совета с default значениями. Спасибо!
Ответ:
VSVLAD
Left Join + NullIf


VSVLAD, Спасибо за помощь! Вопрос решен.

SELECT models._id, name, price, IFNULL(quantity, 0) AS quantity, IFNULL(year, 0) AS year FROM models LEFT JOIN properties ON models._id=model_id
Вопрос: Как реализовать условный join с разными таблицами?

Добрый день.

У меня в таблице есть два поля FROM_USER и TO_USER, содержащие id связанных таблиц.
Специальное целочисленное дескрипторное поле DESCR определяет, какую из двух таблиц нужно присоединить,
физических или юридических лиц.

Как это можно сделать?
Ответ:
mbp64
Добрый день.

У меня в таблице есть два поля FROM_USER и TO_USER, содержащие id связанных таблиц.
Специальное целочисленное дескрипторное поле DESCR определяет, какую из двух таблиц нужно присоединить,
физических или юридических лиц.

Как это можно сделать?

несколько left join, плюс case выражения в списке вывода.