Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Получение одного поля привыборке из 2=х таблиц

T1
         id 
         1
         2
T2
        id pt_id
        1      1
        2      1
        3      1   
        4      2 
        5      3
Select 
    t1.id, t2.id 
from 
  t1 
left join t2
  on t1.id=t2.pt_id

В результате  такого запроса будет таблица из 5 строк, 
        t1.id  t2.id
          1        1
          1        2 
          1        3
          2        4
          2        5
а нужно получить по 1 значению для каждого id из первой таблицы. Например по максимальному id второй.
то есть 
        t1.id  t2.id
          1        3
          2        5




Это сообщение отредактировал(а) Aver78 - 4.9.2016, 19:15
Ответ:
... про остальные поля речи не было, о чем спросили, то вам разжевали. Задавайте новый вопрос.

Этот ответ добавлен с нового Винграда - 
Вопрос: Выбор данных из другой таблицы при заполнении поля

Приветствую. Подскажите пожалуйста.

Есть база данных, созданная в SQL SERVER. Имеет 3 таблицы. Связи установлены так, что при заполнении одного поля в таблице должен появляться выпадающий список, в котором данные, заполненные до этого в другой таблице. Но при запуске это поле получается не списком, а текстбоксом, где нужно все равно это вручную вводить. Подскажите пожалуйста, как это правильно сделать, в каком направлении двигаться.
Ответ:
Сообщение от DSLS
Связи установлены так, что при заполнении одного поля в таблице должен
В таблице никто никому ничего не должен. Не путайте MS SQL Server с аксесом.
Вопрос: Оптимизация вычислений нескольких вычисляемых полей в таблице

Имеется таблица tbl_Group с полями Id, calc_0, calc_1, calc_2, calc_3, ... , calc_5

В этой таблице, согласно названию полей, все, кроме Id является вычисляемым и ссылается на соответствующие функции f_0, f_1, ... , f_5

Каждая функция обращается к таблице (на самом деле табличной функции от Id группы - строки tbl_Groups) fnc_Items и отображает количество элементов в таблице по различным условиям. То есть примерно это выглядит так:

f_0:
T-SQL
1
SELECT COUNT(*) FROM tbl_Items
f_1:
T-SQL
1
2
SELECT COUNT(*) FROM fnc_Items 
WHERE x > 0
f_2:
T-SQL
1
2
SELECT COUNT(*) FROM fnc_Items 
WHERE x BETWEEN 31 AND 60
и так далее.

Таким образом мы получаем, что для того, чтобы выбрать одну строку из таблицы tbl_Group, нам необходимо обратиться к 6-ти разным функциям, которые в свою очередь 6 раз получат таблицу из функции fnc_Items чтобы применить к ней своё условие.

Вопрос заключается в том, можно ли использовать какой либо механизм кэширования или оптимизации, чтобы вызывать на одну строку в селекте таблицу fnc_Items 1 раз, а уже к результату выбора обращаться 6 раз, а не все время пересчитывать табличную функцию на каждое вычисляемое поле.

Используется MSSQL Server 2012, Transact-SQL
Ответ:
Сообщение от alex-ttt
как эта временная таблица должна создаваться и уничтожаться
ээээ как бы все в документации есть
Вопрос: Читает ли сервер строки при запросе одного поля ?

Здравствуйте.

Не могу найти ответ на вопрос как сервер физически читает данные если делается селект только одного поля таблицы ? Происохдит ли при этом чтение всей строки таблицы с диска или нет ?
Проясните пожалуста вопрос кто в курсе дела.
Ответ:
Владислав Колосов
S_A_V_e,

Вы смотрите недостаточно далеко - только на скорость выполнения.
Если будете использовать подобные запросы в приложениях
select * from persondata


Этот код потенциально содержит ошибки, т.е. имеет в виду то, что у вас в голове :)
Математика (кроме ее специальных областей, но это не тот случай) никогда не имеет что-то в виду, всегда нужно точно указывать параметры.
Вы поставите звездочку, т.е. выбрать все атрибуты, затем добавите атрибут (потом) и получите аварийное завершение, т.к. полей станет больше, чем процедура может вставить в таблицу.
То же касается схемы объекта. Во-первых Вы не можете гарантировать, что схема будет указана по умолчанию для соединения, во-вторых можете нарушить логику, создав объекты с одинаковыми именами в разных схемах. Говорить, что "такое никогда не произойдет" нельзя, все равно, что сказать - стакан никогда не разобьется.

Всегда указывайте алисы для полей выборки, указывайте список полей и указывайте схемы. Получите надежный код.


новому поколению, пришедших в разработку БД, лениво не только клавиши нажимать, но и гуглить, читать
Вопрос: В одной таблице два FK на один PK другой таблицы

Здравствуйте.
Есть таблица содержащая два FK на один PK второй таблицы. В общем, если упростить до предела будет так:
CREATE TABLE [A_RUser] ( --Реестр пользователей
	[UserId] [int] NOT NULL ,
	[Family] [varchar] (50) NOT NULL ,
	CONSTRAINT [PK_A_RUser] PRIMARY KEY CLUSTERED ([UserId]) ON [PRIMARY] 
) ON [PRIMARY]
GO

CREATE TABLE [A_Transfer] ( --Акт передачи
	[TransId] [int] IDENTITY (1, 1) NOT NULL ,
	[User_Sender] [int] NOT NULL ,
	[User_Receiver] [int] NOT NULL ,
	[Volume_Transfer] [int] NOT NULL ,
	CONSTRAINT [PK_Trans] PRIMARY KEY CLUSTERED ([TransId]) ON [PRIMARY],
	CONSTRAINT [FK_TransReceiv_RUser]	FOREIGN KEY ([User_Receiver])	REFERENCES [A_RUser] ([UserId]),
	CONSTRAINT [FK_TransSend_RUser]		FOREIGN KEY ([User_Sender])	REFERENCES [A_RUser] ([UserId])
) ON [PRIMARY]
GO
--Наполняем данными
INSERT INTO A_RUser(UserId, Family) VALUES(1, 'Иванов')
INSERT INTO A_RUser(UserId, Family) VALUES(2, 'Петров')
INSERT INTO A_RUser(UserId, Family) VALUES(3, 'Сидоров')
GO
INSERT INTO A_Transfer(User_Sender, User_Receiver, Volume_Transfer) VALUES(1, 2, 10)
INSERT INTO A_Transfer(User_Sender, User_Receiver, Volume_Transfer) VALUES(2, 3, 5)
INSERT INTO A_Transfer(User_Sender, User_Receiver, Volume_Transfer) VALUES(3, 1, 5)

Хоть и упростил до безобразия, но думаю суть понятна.
Вопрос: С одной стороны, все как бы логично, вполне себе нормальное представление реальной ситуации "сегодня петров отправитель, Сидоров получатель, завтра наоборот".
Но с другой стороны какая то ерунда. Каскадное удаление, обновление связанных записей не допустимо (для обоих связей одновременно на MS SQL Server). Запросы с "вытаскиванием через связь", в данном случае Фамилий, ... какие то ... конкретно в этом примере нормально, но ... Если связь будет "длиннее", например через FK через таблицу A_RUser(как "промежуточную") в свою очередь, так же через FK придется "тащить" еще что нибудь из третей таблицы то такая "этажерка" получится.
Короче вопрос, по моему "структура!" какая-то ущербная, то ли таблицы не хватает, то ли Чего? По моему ситуация стандартная, но мой мизерный опыт не позволяет найти решение. Помогите пожалуйста.
Ответ:
ru_efim
Предположим поле A_Transfer.User_Receiver не является обязательным (ну вот передал в некуда и все (предположим, по пустому полю мы определяем например утерю)!). Я вот, сходу, не могу придумать, как построить запрос, возвращающий такой же набор, как приведенный запрос выше. Хотя всего ДВЕ таблицы.



ты еще и SQL не знаешь...
Вот тебе и кажется все.
Короче, для тебя специально - когда кажется, перекрестись и учи SQL.

А тут надо LEFT JOIN.
Вопрос: Нужно вывести данные из 2-х полей присоединенной таблицы

Нужно вывести данные из 2-х полей присоединенной таблицы

так вывожу поле name1 таблицы table2

select table1.id, table2.name1 from table1 join table2 on table1.name_id=table2.id


но мне нужно еще выводить name2 таблицы table2, которое то же соответствует table1.name_id

Как изменить запрос ?

К сообщению приложен файл. Размер - 104Kb
Ответ: terlalex,

В приведенной структуре таблиц в table2 нет поля name2.
Задача не имеет решения.
Вопрос: Как вывести количество одинаковых значений одного поля из таблицы

Привет всем!

Есть таблица фруктов с двумя полями category, name. Категории повторяются (про distinct знаю), а как вывести количество наименований в каждой категории в виде

category | count name

цитрусовые 4
ягоды 2
Ответ: string_out,

group by + count
Вопрос: Сложный запрос: одним запросом вывести таблицу с наибольшим количеством сотрудников

Здравствуйте!

Имеется БД с несколькими таблицами сотрудников разных отделов.
--нужно с помощью одного запроса вывести таблицу с наибольшим количеством сотрудников.
--Суть заключается в том, что таблиц может быть очень много и чтобы не искать в ручную таблицу с наибольшим числом сотрудников нужно сделать это с помощью запроса,видимо сложного.

у меня не получается, прошу помощи. Заранее спасибо
Ответ:
.....зачем надо искать самое большое....
Чтобы знать, кого сокращать.

Добавлено через 7 минут
А почему человеку никто прямо не скажет, что таблица с сотрудниками должна быть одна?
Тут на днях была тема про поле с фотографией в ленточной форме.
Так там была куча таблиц электроприборов, по таблице на каждого поставщика.
Лично мною несколько раз настойчиво рекомендовалось слить в одну.
Ответ был: мне так удобно.
При том, что его неразрешимая проблема с фотографиями порождалась именно наличием множества однородных таблиц.
В конце концов, дело хозяйское...

Добавлено через 8 минут
Тем более, таблицы уже есть и задача есть.
Ответить, а потом уж советовать.
Вопрос: Свод данных из одинаковых полей разных таблиц

Добрый день.

Просьба помочь со следующей задачей:

Имеются отдельные таблицы по запчастям у которых есть одинаковые поля: "Код", "Наименование", "Примечание".
Есть необходимость свести эти поля из разных таблиц в одну "Свод", но не могу понять как это сделать из разных таблиц, поскольку через мастер подстановок для одного поля выбирается поле только из одной таблицы, а у меня их несколько, возможно как то через запросы?
Ответ: МАКЕТ РЕАЛИЗАЦИИ
Вопрос: Создание связей двух внешних ключей к к ключевому полю другой таблицы

Задача:
Организация службы поддержки, которая по запросу выдает исправную технику взамен неисправной.
Имеется пул техники (equipment) и таблица "заявки" (requests). В таблице equipment хранится информация обо всей имеющейся технике и её состояние (в наличии, в ремонте, выдана на замену, отремонтирована). В таблице requests регистрируются заявки на замену техники.
В заявке нужно заполнить поля: sn, number, ... id_equip_to_repair, id_equip_to_replace
id_equip_to_repair - указываетcя id неисправной техники, которая была изъята у пользователя;
id_equip_to_replace - указывается id техники, выданной временно на замену
Оба поля логически должны указывать на primary key "id" в таблице equipment, но mssql не дает создать двойную связь в одному полю так, чтобы выставить свойства update и delete = cascade. Да и смысла особо в таком действии нету, т.к. запросы не отрабатывают корректно в такой ситуации.

На данный момент мысль дошла до того, чтобы сделать двойную связь "многие ко многим", но потом понял, что это действие тоже не принесло особого смысла и ясности в реализацию. Прошу помочь составить базу, либо подсказать каким образом мне составить связи, т.к. чувствую, что знаний реляционных бд в этом случае мне не хватает.
Ответ: Прекратить использовать каскадные операции и все встанет на свои места.