Все запросы объединенные с помощью операторов union ошибка

I have a linq to sql query where I have to perform union two set of records.
And I do not have equal number of fields, so added the null

eg my psuedo code is

var Values=( from c in containers

                   some joins
                   select new PValues

{
 regionid=r.regionid,

  roomid=r.roomid,

  floorid=r.floorid,

  maxarea=r1.maxarea,

  minarea=r1.minarea,

  avgarea=r1.avgarea,

  maxheight=r1.maxheight,

  minheight=r1.minheight

})
.union

( from c in containers

                   some joins

                   select new PValues

{ regionid=j.regionid,

  roomid=j.roomid,

  floorid=j.floorid,

  maxarea=null,

  minarea=null,

  avgarea=null,

  maxheight=j1.maxheight,

  minheight=j1.minheight

})

after googling some hours I came to understand that it is bug in 3.5 framework.

Now I want to retrieve the result.
How do I do that
I tried framing into two seperate iqueryable

var a= first query

var b =second query

ilist result =a.union b

This too results in the same error.

How should I form it

Thanks in advance

Regards
Hema

В этот момент у меня есть таблица tblLocation со столбцами ID, Location, PartOfID.

Таблица рекурсивно связана с собой: PartOfID -> ID

Моя цель состоит в следующем:

> France > Paris > AnyCity >

Объяснение: AnyCity находится в Париже, Париж находится во Франции.

Мое решение, которое я нашел до сих пор, было следующим:

; with q as (
select ID,Location,PartOf_LOC_id from tblLocatie t
where t.ID = 1 -- 1 represents an example
union all
select t.Location + '>' from tblLocation t
inner join q parent on parent.ID = t.LOC_PartOf_ID
)
select * from q

К сожалению, я получаю следующую ошибку:

Все запросы, объединенные с использованием оператора UNION, INTERSECT или EXCEPT, должны иметь равное количество выражений в своих целевых списках.

Если у вас есть идея, как я могу исправить свой вывод, было бы здорово.

4b9b3361

Ответ 1

Проблема здесь:

--This result set has 3 columns
select LOC_id,LOC_locatie,LOC_deelVan_LOC_id from tblLocatie t
where t.LOC_id = 1 -- 1 represents an example

union all

--This result set has 1 columns   
select t.LOC_locatie + '>' from tblLocatie t
inner join q parent on parent.LOC_id = t.LOC_deelVan_LOC_id

Чтобы использовать union или union all количество столбцов , а их типы должны быть одинаковыми, перекрестите все результирующие наборы.

Я думаю, вы должны просто добавить столбец LOC_deelVan_LOC_id во второй результирующий набор

Ответ 2

Второй result set имеет только один столбец, но должен иметь 3 столбца, чтобы он удовлетворялся с первым result set

(столбцы должны совпадать, если вы используете UNION)

Попробуйте добавить ID в качестве первого столбца и PartOf_LOC_id к вашему result set, чтобы вы могли сделать UNION.

;
WITH    q AS ( SELECT   ID ,
                    Location ,
                    PartOf_LOC_id
           FROM     tblLocation t
           WHERE    t.ID = 1 -- 1 represents an example
           UNION ALL
           SELECT   t.ID ,
                    parent.Location + '>' + t.Location ,
                    t.PartOf_LOC_id
           FROM     tblLocation t
                    INNER JOIN q parent ON parent.ID = t.LOC_PartOf_ID
         )
SELECT  *
FROM    q

Ответ 3

Затем число столбцов должно совпадать между обеими частями объединения.

Чтобы построить полный путь, вам необходимо «заполнить» все значения столбца Location. Вам все равно нужно выбрать идентификатор и другие столбцы внутри CTE, чтобы иметь возможность правильно подключаться. Вы избавляетесь от них, просто не выбирая их во внешнем выборе:

with q as 
(
   select ID, PartOf_LOC_id, Location, ' > ' + Location as path
   from tblLocation 
   where ID = 1 

   union all

   select child.ID, child.PartOf_LOC_id, Location, parent.path + ' > ' + child.Location 
   from tblLocation child
     join q parent on parent.ID = t.LOC_PartOf_ID
)
select path
from q;

Ответ 4

Вы можете использовать рекурсивную скалярную функцию: —

set nocount on

create table location (
    id int,
    name varchar(50),
    parent int
)
insert into location values
    (1,'france',null),
    (2,'paris',1),
    (3,'belleville',2),
    (4,'lyon',1),
    (5,'vaise',4),
    (6,'united kingdom',null),
    (7,'england',6),
    (8,'manchester',7),
    (9,'fallowfield',8),
    (10,'withington',8)
go
create function dbo.breadcrumb(@child int)
returns varchar(1024)
as begin
    declare @returnValue varchar(1024)=''
    declare @parent int
    select @returnValue+=' > '+name,@parent=parent
    from location
    where [email protected]
    if @parent is not null
        set @returnValue=dbo.breadcrumb(@parent)[email protected]
    return @returnValue
end
go

declare @location int=1
while @location<=10 begin
    print dbo.breadcrumb(@location)+' >'
    set @location+=1
end

производит: —

 > france >
 > france > paris >
 > france > paris > belleville >
 > france > lyon >
 > france > lyon > vaise >
 > united kingdom >
 > united kingdom > england >
 > united kingdom > england > manchester >
 > united kingdom > england > manchester > fallowfield >
 > united kingdom > england > manchester > withington >

2 / 2 / 0

Регистрация: 03.06.2009

Сообщений: 56

1

При выполнении запроса по вертикальному соединению таблиц произошла ошибка

25.06.2014, 13:28. Показов 11744. Ответов 10


Студворк — интернет-сервис помощи студентам

Сообщение 205, уровень 16, состояние 1, строка 1
Все запросы, объединенные с помощью операторов UNION, INTERSECT или EXCEPT, должны иметь одинаковое число выражений в целевых списках.



0



63 / 63 / 21

Регистрация: 08.02.2013

Сообщений: 262

25.06.2014, 13:30

2

нуу, все ж написано в ошибке)

удостоверься, что все поля объединенных запросов имеют одинаковое количество столбцов



0



2 / 2 / 0

Регистрация: 03.06.2009

Сообщений: 56

25.06.2014, 13:33

 [ТС]

3

т.е. тип поля и количество полей должно быть одинаковым?



0



63 / 63 / 21

Регистрация: 08.02.2013

Сообщений: 262

25.06.2014, 13:37

4

да, все верно



0



2 / 2 / 0

Регистрация: 03.06.2009

Сообщений: 56

25.06.2014, 13:53

 [ТС]

5

Спасибо. Буду искать несовпадения.

Добавлено через 12 минут
интересно, а каким образом можно проверить в какой из таблиц не сходятся типы полей? Просто у меня таблиц ну очень много



0



63 / 63 / 21

Регистрация: 08.02.2013

Сообщений: 262

25.06.2014, 14:02

6

если у тебя несколько UNION, то попробуй компилить постепенно, то есть сначала первых два, потом добавляй по одному, ну и на каком с генерируется ошибка, там и ищи



0



2 / 2 / 0

Регистрация: 03.06.2009

Сообщений: 56

25.06.2014, 14:07

 [ТС]

7

Это понятно. Я думал есть проверки на уровне программ в которых указывается конкретная таблица отличающаяся от других. Все равно Спасибо.



0



63 / 63 / 21

Регистрация: 08.02.2013

Сообщений: 262

25.06.2014, 14:10

8

ну я таких не знаю. Может и есть



0



3333 / 2038 / 727

Регистрация: 02.06.2013

Сообщений: 5,013

25.06.2014, 14:19

9

Типы столбцов не обязательно должны быть одинаковы, а вот количество должно совпадать.



0



1109 / 754 / 182

Регистрация: 27.11.2009

Сообщений: 2,250

25.06.2014, 16:36

10

Цитата
Сообщение от invm
Посмотреть сообщение

Типы столбцов не обязательно должны быть одинаковы, а вот количество должно совпадать.

Они должны быть приводимы к типу с наивысшим приоритетом среди всех объединяемых SELECTов.
И так по каждой колонке.
Например, ‘aaa’ нельзя привести к типу int, который имеет приоритет выше, чем varchar().



0



2 / 2 / 0

Регистрация: 03.06.2009

Сообщений: 56

25.06.2014, 22:59

 [ТС]

11

Еще одно объединение через union — ошибка:
Сообщение 468, уровень 16, состояние 9, строка 1
Не удалось разрешить конфликт параметров сортировки между «Cyrillic_General_CI_AS» и «Cyrillic_General_BIN» в операции UNION.
Что делать?

Добавлено через 6 минут
При соединении таблиц методом union — высвитилась еще одна ошибка:
Сообщение 468, уровень 16, состояние 9, строка 1
Не удалось разрешить конфликт параметров сортировки между «Cyrillic_General_CI_AS» и «Cyrillic_General_BIN» в операции UNION



0



union, который вы пытаетесь применить, используется для получения дополнительных строк в выборке, а не дополнительных столбцов. А все строки разумеется должны иметь одинаковое количество столбцов.

Если я правильно понял, вы хотите получить столбец где будет сумма некоей статистики по каждому игроку (почему в приведенном первым запросе нет group by не представляю, он вам давал сумму по всем игрокам, что при запросе в разрезе игроков как то странно).

select Players.FirstName as 'Имя', 
       Countries.NationalityName as 'Национальность', 
       Teams.TeamName as 'Команда',
       Positions.PositionName as 'Позиция',
       datepart(year,getdate())-datepart(year, Convert(Varchar, DateOfBurn, 104)) as 'Возраст',
       (select sum(StatisticsTable.Falls)
          from StatisticsTable
         where (Players.PlayerID = StatisticsTable.PlayerID)
       )  as 'Фолов за всю жизнь'
from Players, Countries, Positions, Teams
where ((Players.CountryID = Countries.CountryID) and (Players.TeamID = Teams.TeamID) and (Players.PositionID = Positions.PositionID))

Если надо выбрать много колонок из таблицы статистики, то лучше переписать запрос так:

select Players.FirstName as 'Имя', 
       Countries.NationalityName as 'Национальность', 
       Teams.TeamName as 'Команда',
       Positions.PositionName as 'Позиция',
       datepart(year,getdate())-datepart(year, Convert(Varchar, DateOfBurn, 104)) as 'Возраст',
       Stat.Falls as 'Фолов за всю жизнь',
       Stat.xyz as 'Еще какая то статистика'
from Players, Countries, Positions, Teams,
     (select PlayerID, sum(StatisticsTable.Falls) as Falls, sum(xyz) as xyz
        from StatisticsTable
       group by PlayerID
     ) Stat
where Players.CountryID = Countries.CountryID and Players.TeamID = Teams.TeamID
  and Players.PositionID = Positions.PositionID
  and Players.PlayerID = Stat.PlayerID

Хотя это старый пост, я поделюсь другим рабочим примером.

СЧЕТЧИК КОЛОНКИ, А ТАКЖЕ КАЖДЫЙ ТИП ДАННЫХ ДОЛЖНЫ СООТВЕТСТВОВАТЬ ПРИ ИСПОЛЬЗОВАНИИ ‘UNION’ ИЛИ ​​’UNION ALL’

Возьмем пример:

1:

В SQL, если мы напишем — SELECT ‘column1’, ‘column2’ (ПРИМЕЧАНИЕ: не забудьте указать имена в кавычках). В результирующем наборе будут отображаться пустые столбцы с двумя заголовками — column1 и column2.

2: Я поделюсь одним простым случаем, с которым столкнулся.

У меня было семь столбцов с несколькими разными типами данных в SQL. Т.е. uniqueidentifier, datetime, nvarchar

Моей задачей было получить разделенный запятыми набор результатов с заголовком столбца. Таким образом, когда я экспортирую данные в CSV, у меня есть строки, разделенные запятыми, с первой строкой в ​​качестве заголовка и соответствующими именами столбцов.

SELECT CONVERT(NVARCHAR(36), 'Event ID') + ', ' + 
'Last Name' + ', ' + 
'First Name' + ', ' + 
'Middle Name' + ', ' + 
CONVERT(NVARCHAR(36), 'Document Type') + ', ' + 
'Event Type' + ', ' + 
CONVERT(VARCHAR(23), 'Last Updated', 126)

UNION ALL

SELECT CONVERT(NVARCHAR(36), inspectionid) + ', ' + 
       individuallastname + ', ' + 
       individualfirstname + ', ' + 
       individualmiddlename + ', ' +
       CONVERT(NVARCHAR(36), documenttype) + ', ' + 
       'I' + ', ' +
       CONVERT(VARCHAR(23), modifiedon, 126)
FROM Inspection

Выше столбцы «Inspectionid» и «documenttype» имеют uniqueidentifer тип данных и поэтому применены CONVERT(NVARCHAR(36)). столбец «изменено» — это дата и время, поэтому применяется CONVERT(NVARCHAR(23), 'modifiedon', 126).

Параллельно с вышеуказанным 2-м SELECT запросом совпал 1-й SELECT запрос в соответствии с типом данных каждого столбца.

person
Binoy
  
schedule
22.08.2018

Понравилась статья? Поделить с друзьями:
  • Все загрузки с ошибкой что делать
  • Все загрузки с ошибкой что делать
  • Все женщины совершают эту главную ошибку они
  • Все женщины совершают эту главную ошибку они
  • Все есть опыт ошибок не существует