Ответы пользователя по тегу SQL
  • Dinstint по условию, возможно?

    tsklab
    @tsklab
    Здесь отвечаю на вопросы.
    SELECT 'test' FROM `messages` WHERE `sender`=1 or `receiver`=1 order by time DESC

    Подзапрос:
    SELECT MAX('id') FROM `messages` WHERE `sender`=1 or `receiver`=1


    Принцип диалогов в ВК
    Пока вы не приведёте (важнее даже для себя) задачу в терминах БД ничего не получится.
    Ответ написан
    3 комментария
  • [Mssql2012] Как правильно составить рекурсивное выражение?

    tsklab
    @tsklab Куратор тега SQL Server
    Здесь отвечаю на вопросы.
    данные выбирать, как дерево
    Кроме прочих вариантов я использую такой трюк: создаю временную таблицу — список узлов. Делаю из неё курсор. Далее перебираю по порядку, добавляя для каждого узла дочерние в конец этой таблицы. В результате имеем полный список.

    Уточнение:
    если убрать эту строку, то всё работает
    "Дерево" не должно иметь ссылки узла на самого себя.
    Ответ написан
    1 комментарий
  • Как задать размер поля в представлении ms sql?

    tsklab
    @tsklab Куратор тега SQL Server
    Здесь отвечаю на вопросы.
    CAST( [FIELDvarchar(20)] AS varchar(50))
    Ответ написан
    3 комментария
  • Как сгенерировать целочисленный уникальный ID для многопользовательской системы?

    tsklab
    @tsklab
    Здесь отвечаю на вопросы.
    Используйте диапазоны для пользователей (как это делается при репликации для каждой реплики) или префикс.
    Ответ написан
    Комментировать
  • Дизайн БД для сайта фильмо бд?

    tsklab
    @tsklab
    Здесь отвечаю на вопросы.
    Сейчас я планирую все видео (фильм, сериал) пихать в 1 таблицу с меткой типа.

    Все фильмы в одной таблице. По типам распределяется в представлении:
    CREATE TABLE [Film](
    	[ID] [int] IDENTITY(1,1) NOT NULL,
    	[Heading] [int] NULL,
    	[HeadingName] [varchar](20) NULL,
    	[HeadingClose] [bit] NULL,
    	[SeriesName] [varchar](15) NULL,
    	[Series] [smallint] NULL,
    	[SeriesDigit] [smallint] NULL,
    	[Season] [smallint] NULL,
    	[Episode] [smallint] NULL,
    	[PartName] [varchar](15) NULL,
    	[Part] [smallint] NULL,
    	[HeadingNumber]  AS (isnull(isnull([SeriesName]+' ','серия ')+CONVERT([varchar],[Series]),'')+isnull((('s'+right('00'+CONVERT([varchar],[Season]),(2)))+'e')+right('00'+CONVERT([varchar],[Episode]),(2)),'')),
    	[Serias] [smallint] NULL,
    	[Article] [varchar](20) NULL,
    	[Name] [varchar](200) NULL,
    	[NameTranslat] [varchar](200) NULL,
    	[Year] [smallint] NULL,
    	[Premiere] [smalldatetime] NULL,
    	[Country] [varchar](50) NULL,
    	[Addition] [varchar](200) NULL,
    	[TitleArticleLess]  AS ((([Name]+isnull((' ('+[NameTranslat])+')',''))+isnull((' ['+[Addition])+']',''))+isnull(((', '+isnull([PartName],'часть'))+' ')+CONVERT([varchar],[Part]),'')),
    	[TitleBase]  AS ((((isnull([Article]+' ','')+[Name])+isnull((' ('+[NameTranslat])+')',''))+isnull((' ['+[Addition])+']',''))+isnull(((', '+isnull([PartName],'часть'))+' ')+CONVERT([varchar],[Part]),'')),
    	[TitleYear]  AS (((((isnull([Article]+' ','')+[Name])+isnull((' ('+[NameTranslat])+')',''))+isnull((' ['+[Addition])+']',''))+isnull(((', '+isnull([PartName],'часть'))+' ')+CONVERT([varchar],[Part]),''))+isnull(' · '+CONVERT([varchar],[Year],(104)),'')),
    	[TitleCountry]  AS (((((isnull([Article]+' ','')+[Name])+isnull((' ('+[NameTranslat])+')',''))+isnull((' ['+[Addition])+']',''))+isnull(((', '+isnull([PartName],'часть'))+' ')+CONVERT([varchar],[Part]),''))+isnull(' · '+[Country],'')),
    	[TitleYearCountry]  AS ((((((isnull([Article]+' ','')+[Name])+isnull((' ('+[NameTranslat])+')',''))+isnull((' ['+[Addition])+']',''))+isnull(((', '+isnull([PartName],'часть'))+' ')+CONVERT([varchar],[Part]),''))+isnull(' · '+CONVERT([varchar],[Year],(104)),''))+isnull(' · '+[Country],'')),
    	[Cover] [image] NULL,
    	[Note] [text] NULL,
    	[NotWatch] [bit] NULL,
    	[LastWatch] [datetime] NULL,
    	[DateWatch] [datetime] NULL,
    	[WatchDisplay]  AS (isnull('+ '+CONVERT([varchar],[DateWatch],(104)),'')+isnull(case when [DateWatch] IS NULL then CONVERT([varchar],[LastWatch],(104)) else (' ('+CONVERT([varchar],[LastWatch],(104)))+')' end,'')),
    	[Range]  AS ((((((isnull(CONVERT([varchar](4),[Year]),'1895')+right('00'+CONVERT([varchar],isnull([Series],(0))),(3)))+right('00'+CONVERT([varchar],isnull([Season],(0))),(3)))+right('00'+CONVERT([varchar],isnull([Episode],(0))),(3)))+isnull(CONVERT([varchar](8),[Premiere],(112)),'00000000'))+right('00'+CONVERT([varchar],isnull([Part],(0))),(3)))+isnull(upper([Name]),'')),
    	[SearchValue]  AS (replace(rtrim([Name]),' ','+')),
    	[Icon]  AS (CONVERT([bit],isnull(datalength([Note]),(0)),(0))+CONVERT([bit],isnull(datalength([Cover]),(0)),(0))*(2)),
    	[AttributeIcon] [bit] NULL,
     CONSTRAINT [PK_Film] PRIMARY KEY CLUSTERED 
    (
    	[ID] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
    GO
    ALTER TABLE [Film] ADD  CONSTRAINT [DF_Film_AttributeIcon]  DEFAULT ((0)) FOR [AttributeIcon]
    GO
    ALTER TABLE [Film]  WITH CHECK ADD  CONSTRAINT [FK_Film_Film] FOREIGN KEY([Heading])
    REFERENCES [dbo].[Film] ([ID])
    GO
    ALTER TABLE [Film] CHECK CONSTRAINT [FK_Film_Film]
    GO

    Всех актеров, команду (режис., сценарист, и т.д.)

    Все атрибуты фильма в нескольких таблицах.
    Группы атрибутов
    CREATE TABLE [FilmAttributeGroup](
    	[ID] [smallint] IDENTITY(1,1) NOT NULL,
    	[Name] [varchar](50) NOT NULL,
    	[Person] [bit] NULL,
    	[Under] [bit] NULL,
    	[Range] [smallint] NOT NULL,
    	[Uses] [int] NOT NULL,
     CONSTRAINT [PK_FilmAttributeGroup] PRIMARY KEY CLUSTERED 
    (
    	[ID] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    ALTER TABLE [FilmAttributeGroup] ADD  CONSTRAINT [DF_FilmAttributeGroup_Range]  DEFAULT ((0)) FOR [Range]
    GO
    ALTER TABLE [FilmAttributeGroup] ADD  CONSTRAINT [DF_FilmAttributeGroup_Uses]  DEFAULT ((0)) FOR [Uses]
    GO

    Значения атрибутов
    CREATE TABLE [FilmAttributeValue](
    	[ID] [int] IDENTITY(1,1) NOT NULL,
    	[Group] [smallint] NOT NULL,
    	[Value] [varchar](300) NOT NULL,
    	[ValueLeft]  AS (rtrim(case when charindex('(',[Value])>(0) then left([Value],charindex('(',[Value])-(1)) else [Value] end)),
    	[ValueRight]  AS (rtrim(case when charindex('(',[Value])>(0) then substring([Value],charindex('(',[Value])+(1),(charindex(')',[Value])-charindex('(',[Value]))-(1))  end)),
    	[SearchValue]  AS (replace(rtrim(case when charindex('(',[Value])>(0) then left([Value],charindex('(',[Value])-(1)) else [Value] end),' ','+')),
    	[Person] [int] NULL,
    	[Equalize] [bit] NOT NULL,
    	[Uses] [int] NULL,
     CONSTRAINT [PK_FilmAttributeValue] PRIMARY KEY CLUSTERED 
    (
    	[ID] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    ALTER TABLE [FilmAttributeValue] ADD  CONSTRAINT [DF_FilmAttributeValue_Equalize]  DEFAULT ((1)) FOR [Equalize]
    GO
    ALTER TABLE [FilmAttributeValue]  WITH CHECK ADD  CONSTRAINT [FK_FilmAttributeValue_FilmAttributeGroup] FOREIGN KEY([Group])
    REFERENCES [dbo].[FilmAttributeGroup] ([ID])
    ON DELETE CASCADE
    GO
    ALTER TABLE [FilmAttributeValue] CHECK CONSTRAINT [FK_FilmAttributeValue_FilmAttributeGroup]
    GO
    ALTER TABLE [FilmAttributeValue]  WITH CHECK ADD  CONSTRAINT [FK_FilmAttributeValue_Person] FOREIGN KEY([Person])
    REFERENCES [dbo].[Person] ([ID])
    ON DELETE SET NULL
    GO
    ALTER TABLE [FilmAttributeValue] CHECK CONSTRAINT [FK_FilmAttributeValue_Person]
    GO

    Атрибуты фильма
    REATE TABLE [FilmAttribute](
    	[ID] [int] IDENTITY(1,1) NOT NULL,
    	[Film] [int] NOT NULL,
    	[Attribute] [int] NOT NULL,
    	[Addition] [varchar](250) NULL,
    	[GroupEdit] [int] NULL,
     CONSTRAINT [PK_FilmAttribute] PRIMARY KEY CLUSTERED 
    (
    	[ID] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    ALTER TABLE [FilmAttribute]  WITH CHECK ADD  CONSTRAINT [FK_FilmAttribute_Film] FOREIGN KEY([Film])
    REFERENCES [dbo].[Film] ([ID])
    GO
    ALTER TABLE [FilmAttribute] CHECK CONSTRAINT [FK_FilmAttribute_Film]
    GO
    ALTER TABLE [FilmAttribute]  WITH CHECK ADD  CONSTRAINT [FK_FilmAttribute_FilmAttributeValue] FOREIGN KEY([Attribute])
    REFERENCES [dbo].[FilmAttributeValue] ([ID])
    GO
    ALTER TABLE [FilmAttribute] CHECK CONSTRAINT [FK_FilmAttribute_FilmAttributeValue]
    GO

    Персоны
    CREATE TABLE [Person](
    	[ID] [int] IDENTITY(1,1) NOT NULL,
    	[FirstName] [varchar](100) NULL,
    	[LastName] [varchar](100) NOT NULL,
    	[NameRussian] [varchar](200) NULL,
    	[BirthDay] [smalldatetime] NULL,
    	[BirthPlace] [varchar](100) NULL,
    	[DeathDay] [smalldatetime] NULL,
    	[DeathPlace] [varchar](100) NULL,
    	[Text] [text] NULL,
    	[Picture] [image] NULL,
    	[Uses] [int] NULL,
    	[NameFull]  AS ((isnull([FirstName]+' ','')+ltrim([LastName]))+isnull((' ('+[NameRussian])+')','')),
    	[NameOrder]  AS ((ltrim([LastName])+isnull(', '+[FirstName],''))+isnull((' ('+[NameRussian])+')','')),
    	[SearchValue]  AS (isnull(replace([FirstName],' ','+')+'+','')+replace([LastName],' ','+')),
    	[NoteIcon]  AS (CONVERT([bit],isnull(datalength([Text]),(0)),(0))+CONVERT([bit],isnull(datalength([Picture]),(0)),(0))*(2)),
    	[Key]  AS ('P'+CONVERT([varchar],[ID])),
     CONSTRAINT [PK_Performer] PRIMARY KEY CLUSTERED 
    (
    	[ID] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
    GO
    ALTER TABLE [Person] ADD  CONSTRAINT [DF_Person_Uses]  DEFAULT ((0)) FOR [Uses]
    GO
    Ответ написан
    Комментировать
  • SQL SELECT article by tags?

    tsklab
    @tsklab
    Здесь отвечаю на вопросы.
    Но мне теперь еще нужно фильтр articles, что не имеют тега.

    SELECT articles.ID, articles.Name
      FROM articles LEFT OUTER JOIN  article_tags ON articles.ID = article_tags.article_id
      WHERE (article_tags.tag_id IS NULL)

    tag из перечиня
    Создаём таблицу этого перечня.
    CREATE TABLE [dbo].[tag_list](
    	[ID] [int] NULL,
    	[tag_id] [int] NULL
    ) ON [PRIMARY]

    И получаем нужный набор:
    SELECT DISTINCT articles.ID, articles.Name
      FROM articles INNER JOIN article_tags ON articles.ID = article_tags.article_id 
                             INNER JOIN tag_list ON article_tags.tag_id = tag_list.tag_id
    Ответ написан
    Комментировать
  • Как правильно построить поисковый запрос?

    tsklab
    @tsklab
    Здесь отвечаю на вопросы.
    написать клас на php
    Используйте инструментальные средства MS SQL (SSMS или SSDT) и помещайте запрос в хранимую процедуру для сохранения запроса на сервере.
    Ответ написан
  • Что подразумевает это задание?

    tsklab
    @tsklab
    Здесь отвечаю на вопросы.
    Имеется ввиду, что большинство систем (сказать "все" — самонадеянно) регистрируют человека по паспорту. Несовершеннолетний ребенок не имеет паспорта, а вписан в паспорт родителей. Соответственно все действия нужно проводить по паспорту родителя, что бы не вводить для этих детей отдельную сущность по регистрации по свидетельству о рождении.
    Ответ написан
    Комментировать
  • Как высчитать общее время событий?

    tsklab
    @tsklab
    Здесь отвечаю на вопросы.
    "наименования событий" здесь для примера, пусть будет id

    То есть по ID определяем сущность. Хорошо. В начале события добавляем запить о нём. По окончании — запись ( ID, окончание). Вопрос: почему не находим запись ID и записываем время окончания в поле "Окончание" этой записи? И получаем всё, что вам нужно.
    Ответ написан
  • Как выполнить sql update в 2 таблицах?

    tsklab
    @tsklab
    Здесь отвечаю на вопросы.
    Использовать триггер. Или построить представление.
    Ответ написан
    Комментировать
  • Запрос Select вывод одной и тойже строчки из столбца, несколько раз подряд??

    tsklab
    @tsklab
    Здесь отвечаю на вопросы.
    Правильный ответ:
    SELECT TOP (5) [table].Name
      FROM [table] CROSS JOIN [table] AS table_5_more_rows
      WHERE ([table].Name = 'Павел')
    Ответ написан
    Комментировать
  • Как исправить Violation of PRIMARY KEY constraint с составным PK?

    tsklab
    @tsklab Куратор тега SQL Server
    Здесь отвечаю на вопросы.
    Как исправить Violation of PRIMARY KEY constraint с составным PK?
    Настроена репликация транзакциями…
    Попробуйте выключить репликацию столбца, таблицы, базы (поочерёдно).
    составной индекс
    Используйте суррогатный ключ.
    из трех колонок
    Сделайте уникальный ключ, исключительно для проверки.
    Ответ написан
  • Как правильно написать запрос с DISTINCT или GROUP BY?

    tsklab
    @tsklab
    Здесь отвечаю на вопросы.
    SELECT DISTINCT [trigger] FROM notification_role WHERE notification_role.role="curator"
    UNION 
    SELECT DISTINCT [trigger] FROM notification_user WHERE notification_user.user_id=15

    UNION и так собирает только уникальные атрибуты.
    UNION ALL — все.
    Ответ написан
    4 комментария
  • Как лучше хранить SQL запросы?

    tsklab
    @tsklab
    Здесь отвечаю на вопросы.
    Я храню в виде sql-скрипта вместе с исходными файлами программы, под системой контроля версий CVS.
    Ответ написан
  • Поможете разобраться с ошибкой System.Data.SqlClient.SqlException (0x80131904): Must declare the scalar variable?

    tsklab
    @tsklab
    Здесь отвечаю на вопросы.
    Сформируйте строку SQL без параметров (подставив нужные значения в неё) и выполните.
    Ответ написан
    Комментировать
  • Оправдано ли использование строкового первичного ключа?

    tsklab
    @tsklab Куратор тега SQL Server
    Здесь отвечаю на вопросы.
    Например есть таблица, хранящая каталог автомобилей. Оправдано ли будет сделать первичным ключем гос.номер
    Оправдано, но гос. номер не определяет сущность (автомобиль). Возможно определяет VIN, но это нужно определять по предметной области. Использование суррогатного ключа (обычно автоинкрементное число, хотя может быть всё, что угодно, например, uniqueidentifier 0E984725-C51C-4BF4-9960-E1C80E27ABA0) избавляет от необходимости искать (и понимать его уникальность) естественный ключ.
    Ответ написан
    Комментировать