PDA

View Full Version : سوال: کنار هم قرار دادن نتایج دو یا چند select



HosseinProgrammer
جمعه 29 آبان 1388, 23:30 عصر
سلام.

می خواستم نتایج دو یا چند عبارت select را کنار هم قرار بدم. طوریکه مثل یک جدول به نظر بیاد. دو تا select تعداد رکوردهای یکسانی در خروجی دارند.



select a from aa

select b from bb

Reza.ariyan
جمعه 29 آبان 1388, 23:47 عصر
اینطوری



select a,b from aa,bb

Reza.ariyan
جمعه 29 آبان 1388, 23:57 عصر
البته اگه می خوای مسئله رو بپیچونی اینطوری هم میشه :چشمک:




SELECT * FROM (select a from aa) as T1 ,(select b from bb) as T2

HosseinProgrammer
شنبه 30 آبان 1388, 09:16 صبح
سلام دوست عزیز. من منظورم چیزی که شما گفتید نبود.



create table x(a int)
create table y(b int)
insert into x values(1),(2),(3)
insert into y values(5),(6),(7)



select a from x
خروجی:


a
-
1
2
3




select b from y


خروجی:


b
-
5
6
7


جواب شما:


select * from (select * from x) as t1, (select * from y) as t2


خروجی کد شما:


a b
----
1 5
2 5
3 5
1 6
2 6
3 6
1 7
2 7
3 7


خروجی مورد انتظار من:


a b
----
1 5
2 6
3 7

Reza.ariyan
شنبه 30 آبان 1388, 12:39 عصر
جدول هات فیلد ID برای Identity دارن ؟ یعنی شماره ردیف ؟

HosseinProgrammer
شنبه 30 آبان 1388, 13:01 عصر
نه. فیلد identity ندارم. توی دستور create table هم مشخص است. :چشمک:

حالا مگه داشتن یا نداشتن این فیلد اهمیتی داره؟

Reza.ariyan
شنبه 30 آبان 1388, 13:32 عصر
این اسکریپتت میشه


SELECT a,
b
FROM ( SELECT RANK() OVER ( ORDER BY dbo.x.ID ASC ) AS 'ID',
dbo.x.a
FROM dbo.x
) tbl1
INNER JOIN ( SELECT RANK() OVER ( ORDER BY dbo.y.ID ASC ) AS 'ID',
dbo.y.b
FROM dbo.y
) tbl2 ON tbl1.ID = tbl2.ID


همیشه سعی کن تو جدول هات یک فیلد از Primary داشته باشی که Auto increment باشه و نقش ردیف رو بازی کنه

Reza.ariyan
شنبه 30 آبان 1388, 13:36 عصر
جدول x رو اینطوری بساز


CREATE TABLE [dbo].[x](
[ID] [int] IDENTITY(1,1) NOT NULL,
[a] [int] NOT NULL,
CONSTRAINT [PK_x] 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]

جدول Y رو اینطوری بساز


CREATE TABLE [dbo].[y](
[ID] [int] IDENTITY(1,1) NOT NULL,
[b] [int] NOT NULL,
CONSTRAINT [PK_y] 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]

HosseinProgrammer
یک شنبه 01 آذر 1388, 09:19 صبح
از پاسختون ممنونم.
اگر در مورد عملکرد تابع RANK هم یک توضیحی بدید ممنون میشم.

HosseinProgrammer
یک شنبه 01 آذر 1388, 11:24 صبح
دوباره سلام دوست عزیز .
اصل سوال من در مورد مسئله زیر بود که با توضیحات شما به نتیجه نرسید.
سوال این است:
جداول موجود:



Create Table City
(
Code int identity,
City_Name nvarchar(30),
Primary Key (code)
)
Create Table Table2
(
Code int references City primary key identity,
Source int references City,
Destination int references City,
Export int references City,
)

مقادیر موجود در جدول:



Insert into City Values('Kashan'),('Tehran'),('Esfahan')


Insert into Table2 Values (1, 2, 1),(2, 1, 2) ,(1, 2, 3)




City
| Code | Source |
------------------------
1 Kashan
2 Tehran
3 Esfahan


Table2
| Code | Source | Destination | Export |
-----------------------------------------------------
1 1 2 1
2 2 1 2
3 1 2 3

حالا مشکل اینه که من یک Query میخوام که در جدول 2 بجای اعدادی که در فیلدهای Source , Destination , Export وجود دارند ، نام متناظر شهر آنها نمایش داده شود.




| Code | Source | Destination | Export |
-----------------------------------------------------
1 Kashan Tehran Kashan
2 Tehran Kashan Tehran
3 Kashan Tehran Esfahan




پیشاپیش از جواب شما ممنونم.

Reza.ariyan
یک شنبه 01 آذر 1388, 12:36 عصر
از پاسختون ممنونم.
اگر در مورد عملکرد تابع RANK هم یک توضیحی بدید ممنون میشم.
Rank برای ایجاد یک فیلد به شماره ردیف است -
ینی جدول شما اگه این باشه
Name
-------
Ali
Reza
Kachal
Ahmad

خروجی Select از این جدول با Rank over با فیلد ID میشه این
ID Name
------- ------
1 Ali
2 Reza
3 Kachal
4 Ahmad

Reza.ariyan
یک شنبه 01 آذر 1388, 13:08 عصر
دوباره سلام دوست عزیز .
اصل سوال من در مورد مسئله زیر بود که با توضیحات شما به نتیجه نرسید.
سوال این است:

اگه سوال این است ، پاسخ هم این است :چشمک:
اگه میخوای جواب درست بگیری همیشه همون اولش سوال رو کامل بپرسی بهتره (البته اگه دوس داشتی)



SELECT
Sources.Source , Destinations.Destination , Exports.Export
FROM (SELECT RANK() OVER (ORDER BY dbo.Table2.Code) AS ID ,
City.City_Name AS Source
FROM City
INNER JOIN Table2 ON City.Code=Table2.Source) AS Sources
INNER JOIN (SELECT RANK() OVER (ORDER BY dbo.Table2.Code) AS ID ,
City.City_Name AS Destination
FROM City
INNER JOIN Table2 ON City.Code=Table2.Destination)
AS Destinations ON Sources.ID=Destinations.ID
INNER JOIN (SELECT RANK() OVER (ORDER BY dbo.Table2.Code) AS ID ,
City.City_Name AS Export
FROM City
INNER JOIN Table2 ON City.Code=Table2.Export) AS Exports ON Destinations.ID=Exports.ID