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, должны иметь равное количество выражений в своих целевых списках.
Если у вас есть идея, как я могу исправить свой вывод, было бы здорово.
Ответ 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
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 |
Типы столбцов не обязательно должны быть одинаковы, а вот количество должно совпадать. Они должны быть приводимы к типу с наивысшим приоритетом среди всех объединяемых SELECTов.
0 |
2 / 2 / 0 Регистрация: 03.06.2009 Сообщений: 56 |
|
25.06.2014, 22:59 [ТС] |
11 |
Еще одно объединение через union — ошибка: Добавлено через 6 минут
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