【急】请教一条SQL语句!

时间:2022-04-21 11:39:38
我有两个表User1 和 User2 两个表都有主键ID,User1里还有两列 FZR 和 isUser1,FZR 里的值是User1 或 User2 的ID,用isUser1区分(0表示是User1的ID,1表示是User2的ID)

-----------------
现在User1里有记录
ID  FZR  isUser1
1   2    0
2   1    1
-----------------
-----------------
User2里有记录
ID  Name
1   abc
-----------------

现在两表联查,select * from User1,User2 where ???
后面的条件怎么写,请帮帮忙,谢谢!!!

11 个解决方案

#1


up 主要是你想要查什么?

#2


将你想要的效果画个表出来 才知道你到底想干嘛?

#3


你想根据什么条件查啊??查啥啊

#4


呵呵,没说清楚!

补充一下,User1表也有一列 Name

----------------- 
现在User1里有记录 
ID  Name  FZR  isUser1 
1   111   2    0 
2   222   1    1 
----------------- 
----------------- 
User2里有记录 
ID  Name 
1   abc 
-----------------

我想查User1表中的所有记录,结果是User1的第二条记录的FZR为abc,第一条记录的FZR为222

另外,我想问一下,SQL语句里加判断用CASE WHEN THEN ??? END,?的位置好像不能加表达式(例如 a = 1)

#5


CASE WHEN THEN ??? END,?

可以用decode函数

#6


没看明白。。

#7


decode 是 oracle 的函数,sql server 用不了!!

#8


decode 是 oracle 的函数,sql server 用不了!!

#9


现在我们介绍连接(join)的概念。要了解连接,我们需要用到许多我们之前已介绍过的指令。 我们先假设我们有以下的两个表格, 

Store_Information 表格

store_name  Sales  Date 
 
Los Angeles  $1500  Jan-05-1999 
 
San Diego  $250  Jan-07-1999 
 
Los Angeles  $300  Jan-08-1999 
 
Boston  $700  Jan-08-1999 
 
 
Geography 表格 

region_name  store_name 
 
East  Boston 
 
East  New York 
 
West  Los Angeles 
 
West  San Diego 
 
 

而我们要知道每一区 (region_name) 的营业额 (sales)。 Geography 这个表格告诉我们每一区有哪些店,而 Store_Information 告诉我们每一个店的营业额。 若我们要知道每一区的营业额,我们需要将这两个不同表格中的资料串联起来。当我们仔细了解这两个 表格后,我们会发现它们可经由一个相同的栏位,store_name,连接起来。我们先将 SQL 句列出, 之后再讨论每一个子句的意义: 

SELECT A1.region_name REGION, SUM(A2.Sales) SALES 
FROM Geography A1, Store_Information A2 
WHERE A1.store_name = A2.store_name 
GROUP BY A1.region_name 

结果: 

REGION SALES
 
East $700
 
West $2050
 

在第一行中,我们告诉 SQL 去选出两个栏位:第一个栏位是 Geography 表格中的 Region_name 栏位 (我们取了一个别名叫做 REGION);第二个栏位是 Store_Information 表格中的 sales 栏位 (别名为 SALES)。请注意在这里我们有用到表格别名:Geography 表格的别名是 A1,Store_Information 表格的别名是 A2。若我们没有用表格别名的话, 第一行就会变成 

SELECT Geography.region_name REGION, SUM(Store_Information.Sales) SALES 

很明显地,这就复杂多了。在这里我们可以看到表格别名的功用:它能让 SQL 句容易被了解,尤其是这个 SQL 句含盖好几个不同的表格时。 

接下来我们看第三行,就是 WHERE 子句。 这是我们阐述连接条件的地方。在这里,我们要确认 Geography 表格中 Store_name 栏位的值与 Store_Information 表格中 store_name 栏位的值是相等的。这个 WHERE 子句是一个连接的灵魂人物,因为它的角色是确定两个表格之间的连接是正确的。如果 WHERE子句是错误的,我们就极可能得到一个笛卡儿连接 (Cartesian join)。笛卡儿连接会造成我们得到所有两个表格每两行之间所有可能的组合。在这个例子中,笛卡儿连接会让我们得到 4 x 4 = 16 行的结果。 

#10


declare @dt1 table(id int ,name char(10),fzr char(10),isuser1 char(10))
declare @dt2 table(id int,name char(10))
insert into @dt1 select 1,'111','2','0'
union all select 2,'222','1','1'
insert into @dt2 select 1,'abc'
select * from @dt1
select * from @dt2
select id=case a.isuser1 when '0' then (select id from @dt2)
when '1'  then  a.id end,
name=case a.isuser1 when '0' then (select name from @dt2)
when '1' then a.name end,
isnull(fzr,'0') as fzr,isnull(isuser1,'0')
from @dt1 as a

#11


declare @dt1 table(id int ,name char(10),fzr char(10),isuser1 char(10))
declare @dt2 table(id int,name char(10))
insert into @dt1 select 1,'111','2','0'
union all select 2,'222','1','1'
insert into @dt2 select 1,'abc'
union all select 2,'cba'
select id=case a.isuser1 when '0' then (select id from @dt2 where a.id=id)
            when '1'  then  a.id end,
        name=case a.isuser1 when '0' then (select name from @dt2 where a.id=id)
            when '1' then a.name end,
        isnull(fzr,'0') as fzr,isnull(isuser1,'0')
from @dt1 as a
 

忽略了个问题 这个应该ok了 ,fzr,isuser1 可以跟id,name 是一样的

#1


up 主要是你想要查什么?

#2


将你想要的效果画个表出来 才知道你到底想干嘛?

#3


你想根据什么条件查啊??查啥啊

#4


呵呵,没说清楚!

补充一下,User1表也有一列 Name

----------------- 
现在User1里有记录 
ID  Name  FZR  isUser1 
1   111   2    0 
2   222   1    1 
----------------- 
----------------- 
User2里有记录 
ID  Name 
1   abc 
-----------------

我想查User1表中的所有记录,结果是User1的第二条记录的FZR为abc,第一条记录的FZR为222

另外,我想问一下,SQL语句里加判断用CASE WHEN THEN ??? END,?的位置好像不能加表达式(例如 a = 1)

#5


CASE WHEN THEN ??? END,?

可以用decode函数

#6


没看明白。。

#7


decode 是 oracle 的函数,sql server 用不了!!

#8


decode 是 oracle 的函数,sql server 用不了!!

#9


现在我们介绍连接(join)的概念。要了解连接,我们需要用到许多我们之前已介绍过的指令。 我们先假设我们有以下的两个表格, 

Store_Information 表格

store_name  Sales  Date 
 
Los Angeles  $1500  Jan-05-1999 
 
San Diego  $250  Jan-07-1999 
 
Los Angeles  $300  Jan-08-1999 
 
Boston  $700  Jan-08-1999 
 
 
Geography 表格 

region_name  store_name 
 
East  Boston 
 
East  New York 
 
West  Los Angeles 
 
West  San Diego 
 
 

而我们要知道每一区 (region_name) 的营业额 (sales)。 Geography 这个表格告诉我们每一区有哪些店,而 Store_Information 告诉我们每一个店的营业额。 若我们要知道每一区的营业额,我们需要将这两个不同表格中的资料串联起来。当我们仔细了解这两个 表格后,我们会发现它们可经由一个相同的栏位,store_name,连接起来。我们先将 SQL 句列出, 之后再讨论每一个子句的意义: 

SELECT A1.region_name REGION, SUM(A2.Sales) SALES 
FROM Geography A1, Store_Information A2 
WHERE A1.store_name = A2.store_name 
GROUP BY A1.region_name 

结果: 

REGION SALES
 
East $700
 
West $2050
 

在第一行中,我们告诉 SQL 去选出两个栏位:第一个栏位是 Geography 表格中的 Region_name 栏位 (我们取了一个别名叫做 REGION);第二个栏位是 Store_Information 表格中的 sales 栏位 (别名为 SALES)。请注意在这里我们有用到表格别名:Geography 表格的别名是 A1,Store_Information 表格的别名是 A2。若我们没有用表格别名的话, 第一行就会变成 

SELECT Geography.region_name REGION, SUM(Store_Information.Sales) SALES 

很明显地,这就复杂多了。在这里我们可以看到表格别名的功用:它能让 SQL 句容易被了解,尤其是这个 SQL 句含盖好几个不同的表格时。 

接下来我们看第三行,就是 WHERE 子句。 这是我们阐述连接条件的地方。在这里,我们要确认 Geography 表格中 Store_name 栏位的值与 Store_Information 表格中 store_name 栏位的值是相等的。这个 WHERE 子句是一个连接的灵魂人物,因为它的角色是确定两个表格之间的连接是正确的。如果 WHERE子句是错误的,我们就极可能得到一个笛卡儿连接 (Cartesian join)。笛卡儿连接会造成我们得到所有两个表格每两行之间所有可能的组合。在这个例子中,笛卡儿连接会让我们得到 4 x 4 = 16 行的结果。 

#10


declare @dt1 table(id int ,name char(10),fzr char(10),isuser1 char(10))
declare @dt2 table(id int,name char(10))
insert into @dt1 select 1,'111','2','0'
union all select 2,'222','1','1'
insert into @dt2 select 1,'abc'
select * from @dt1
select * from @dt2
select id=case a.isuser1 when '0' then (select id from @dt2)
when '1'  then  a.id end,
name=case a.isuser1 when '0' then (select name from @dt2)
when '1' then a.name end,
isnull(fzr,'0') as fzr,isnull(isuser1,'0')
from @dt1 as a

#11


declare @dt1 table(id int ,name char(10),fzr char(10),isuser1 char(10))
declare @dt2 table(id int,name char(10))
insert into @dt1 select 1,'111','2','0'
union all select 2,'222','1','1'
insert into @dt2 select 1,'abc'
union all select 2,'cba'
select id=case a.isuser1 when '0' then (select id from @dt2 where a.id=id)
            when '1'  then  a.id end,
        name=case a.isuser1 when '0' then (select name from @dt2 where a.id=id)
            when '1' then a.name end,
        isnull(fzr,'0') as fzr,isnull(isuser1,'0')
from @dt1 as a
 

忽略了个问题 这个应该ok了 ,fzr,isuser1 可以跟id,name 是一样的