首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 多表查询 [已结贴,结贴人:hnsongbiao]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-08 09:28:14 楼主
    数据库中有3个表,现在要求一次在这三个表中查询,获得查询结果:
    TA表 字段是TAID,TAKEY,TACONTENT
    TB表 字段是TBID,TBKEY,TBCONTENT
    TC表 字段是TCID,TCKEY,TCCONTENT

    查询的关键词是TK,要求查询在三个表中的TAKEY,TACONTENT,TBKEY,TBCONTENT,TCKEY,TCCONTENT,是否符合,

    一次性查出记录,可以实现吗?


    分别在ACCESS,SQL2000中用SQL查询

    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-08 09:29:381楼 得分:0
    看不懂
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-08 09:36:232楼 得分:0
    SQL code
    SELECT * FROM ( SELECT TAKEY,TACONTENT FROM TA表 UNION ALL SELECT TBKEY,TBCONTENT FROM TB表 UNION ALL SELECT TCKEY,TCCONTENT FROM TB表 ) T WHERE charindex(ltrim(T.TCKEY)+' '+ltrim(T.TACONTENT),'TK')>0
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jaxio
    • 等级:
    发表于:2008-07-08 09:36:363楼 得分:0
    up.LZ没说明白。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-08 09:37:264楼 得分:0
    SQL code
    --try SELECT * FROM ( SELECT TAKEY,TACONTENT FROM TA表 UNION ALL SELECT TBKEY,TBCONTENT FROM TB表 UNION ALL SELECT TCKEY,TCCONTENT FROM TB表 ) T WHERE charindex('TK',ltrim(T.TCKEY)+' '+ltrim(T.TACONTENT))>0 --刚才写反了..
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-08 09:40:505楼 得分:0
    应该是苦行僧理解的意思
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-08 10:08:516楼 得分:0
    接苦行僧理解的意思:
    TAKEY最后字母T,TACONTENT第一字母K 应该是不符合要求的吧。
    语句应改为如下:

    SQL code
    SELECT * FROM ( SELECT TAKEY,TACONTENT FROM TA表 UNION ALL SELECT TBKEY,TBCONTENT FROM TB表 UNION ALL SELECT TCKEY,TCCONTENT FROM TB表 ) T WHERE charindex('TK',ltrim(T.TCKEY))>0 or charindex('TK',ltrim(T.TACONTENT))>0
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-08 10:11:397楼 得分:0
    TA表 字段是TAID,TAKEY,TACONTENT
    TB表 字段是TBID,TBKEY,TBCONTENT
    TC表 字段是TCID,TCKEY,TCCONTENT

    查询的关键词是TK,要求查询在三个表中的TAKEY,TACONTENT,TBKEY,TBCONTENT,TCKEY,TCCONTENT,是否符合,

    一次性查出记录,可以实现吗?

    ---


    举点例子看看
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • utpcb
    • 等级:
    发表于:2008-07-08 10:26:228楼 得分:0
    楼猪说明白点呵呵
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dutguoyi
    • 等级:
    发表于:2008-07-08 12:47:319楼 得分:0
    这个意思?
    select * from TA
    where charindex(TAKEY, 'TK') > 0
    union
    select * from TA
    where charindex(TACONTENT, 'TK') > 0
    union
    select * from TB
    where charindex(TBKEY, 'TK') > 0
    union
    select * from TB
    where charindex(TBCONTENT, 'TK') > 0
    union
    select * from TC
    where charindex(TCKEY, 'TK') > 0
    union
    select * from TC
    where charindex(TCCONTENT, 'TK') > 0
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-08 13:20:4810楼 得分:0
    引用 6 楼 rhq12345 的回复:
    接苦行僧理解的意思:
    TAKEY最后字母T,TACONTENT第一字母K 应该是不符合要求的吧。
    语句应改为如下:


    SQL code
    SELECT * FROM (
    SELECT TAKEY,TACONTENT FROM TA表
    UNION ALL
    SELECT TBKEY,TBCONTENT FROM TB表
    UNION ALL
    SELECT TCKEY,TCCONTENT FROM TB表
    ) T
    WHERE charindex('TK',ltrim(T.TCKEY))>0 or charindex('TK',ltrim(T.TACONTENT))>0

    我中间加了一个空格的 :)
    理论上应该可以屏蔽你说的这种情况,
    没有测试过
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-08 13:28:4311楼 得分:0
    SQL code
    SELECT * FROM ( SELECT * FROM TA UNION ALL SELECT * FROM TB UNION ALL SELECT * FROM Tc ) a WHERE charindex('TK',ltrim(TCKEY)+ltrim(TACONTENT))>0
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-08 13:31:5612楼 得分:100
    SQL code
    declare @TA table(TAID int, TAKEY nvarchar(10),TACONTENT nvarchar(10)) declare @TB table(TBID int, TBKEY nvarchar(10),TBCONTENT nvarchar(10)) declare @TC table(TCID int, TCKEY nvarchar(10),TCCONTENT nvarchar(10)) INSERT INTO @TA SELECT 1,'T','K' UNION ALL SELECT 2,'TT','AK' UNION ALL SELECT 3,'TK','TK' UNION ALL SELECT 4,'KT','TK' INSERT INTO @TB SELECT 5,'TR','K' UNION ALL SELECT 6,'TTS','AK' UNION ALL SELECT 7,'TKU','TK' UNION ALL SELECT 8,'KTP','TK' INSERT INTO @TC SELECT 9,'TRT','K' UNION ALL -- 这一行没有选出来 SELECT 10,'TTSTK','AK' UNION ALL SELECT 11,'TKUS','TSK' UNION ALL SELECT 12,'KTP','TRK' SELECT * FROM ( SELECT TAID,TAKEY,TACONTENT FROM @TA UNION ALL SELECT TBID,TBKEY,TBCONTENT FROM @TB UNION ALL SELECT TCID,TCKEY,TCCONTENT FROM @TC ) T WHERE charindex('TK',ltrim(T.TAKEY)+' '+ltrim(T.TACONTENT))>0 /* TAID TAKEY TACONTENT ----------- ---------- ---------- 3 TK TK 4 KT TK 7 TKU TK 8 KTP TK 10 TTSTK AK 11 TKUS TSK */
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-08 13:45:0813楼 得分:0
    TA表 字段是TAID,TAKEY,TACONTENT

    TAID  TAKEY  TACONTENT
    1      电话      内容....
    2      电视      内容...
    3      电脑      内容...
    ..

    TB表 字段是TBID,TBKEY,TBCONTENT
    TBID    TBKEY  TBCONTENT
    1      电子      内容....
    2      电器      内容...
    3      桌子      内容...
    ..

    TC表 字段是TCID,TCKEY,TCCONTENT
    TCID    TCKEY    TCCONTENT
    1      中国      内容....
    2      人民      内容...
    3      电        内容...
    ..

    比如搜索“电”这个关键词,同时搜索三个表,
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-08 13:47:1214楼 得分:0
    SQL code
    SELECT * FROM ( SELECT TAKEY,TACONTENT FROM TA UNION ALL SELECT TBKEY,TBCONTENT FROM TB UNION ALL SELECT TCKEY,TCCONTENT FROM Tc ) a WHERE charindex('TK',ltrim(TAKEY)+ltrim(TACONTENT))>0
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-08 13:49:1315楼 得分:0
    12楼已经可以了啊~......
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-08 14:09:3116楼 得分:0
    SELECT * FROM (
    SELECT TAKEY,TACONTENT FROM TA表
    UNION ALL
    SELECT TBKEY,TBCONTENT FROM TB表
    UNION ALL
    SELECT TCKEY,TCCONTENT FROM TB表
    ) T
    WHERE charindex(ltrim(T.TCKEY)+' '+ltrim(T.TACONTENT),'TK')>0
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-08 15:47:3717楼 得分:0
    SQL code
    SELECT * FROM ( SELECT TAID,TAKEY,TACONTENT FROM @TA UNION ALL SELECT TBID,TBKEY,TBCONTENT FROM @TB UNION ALL SELECT TCID,TCKEY,TCCONTENT FROM @TC ) T WHERE charindex('TK',ltrim(T.TAKEY)+' '+ltrim(T.TACONTENT))>0


    支持
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-08 16:14:1518楼 得分:0
    为什么
    WHERE charindex('TK',ltrim(T.TAKEY)+' '+ltrim(T.TACONTENT))>0

    TBKEY,TBCONTENT  怎么不考虑?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-08 16:21:2619楼 得分:0
    12楼写得非常详细了,运行一下就可以明白了
    union all所有的表,如果几个表的字段不一样,则默认以第一个表的字段为最后字段。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-08 17:37:1020楼 得分:0
    为什么在ACCESS里不能运行呢?ACCESS里的语句应该怎么写?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-08 18:43:0021楼 得分:0
    引用 20 楼 hnsongbiao 的回复:
    为什么在ACCESS里不能运行呢?ACCESS里的语句应该怎么写?

    access的不会,
    会的兄弟帮帮写一下 :)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-09 09:13:4322楼 得分:0
    本示例使用 InStr 函数来查找某字符串在另一个字符串中首次出现的位置。
    Dim SearchString, SearchChar, MyPos
    SearchString ="XXpXXpXXPXXP" ' 被搜索的字符串。
    SearchChar = "P" ' 要查找字符串 "P"。
    ' 从第四个字符开始,以文本比较的方式找起。返回值为 6(小写 p)。
    ' 小写 p 和大写 P 在文本比较下是一样的。
    MyPos = Instr(4, SearchString, SearchChar, 1)
    ' 从第4个字符开使,按照原文比较的方式找起。返回值为 9(大写 P)。
    ' 小写 p 和大写 P 在二进制比较下是不一样的。
    MyPos = Instr(1, SearchString, SearchChar, 0)
    ' 缺省的比对方式为二进制比较(最后一个参数可省略)。
    MyPos = Instr(SearchString, SearchChar) ' 返回 9。
    MyPos = Instr(1, SearchString, "W") ' 返回 0。


    SELECT * FROM (
    SELECT TAKEY,TACONTENT FROM TA表
    UNION ALL
    SELECT TBKEY,TBCONTENT FROM TB表
    UNION ALL
    SELECT TCKEY,TCCONTENT FROM TB表
    ) T
    WHERE Instr(1, T.TCKEY, "tk")>0


    这样可以吗?怎么出现无效字符 ?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-09 09:57:0423楼 得分:0
    在access中,用你那样的写法应该是没问题的。我用我的数据测试没问题。

    我认为你的这条语句WHERE Instr(1, T.TCKEY, "tk")>0 中,字段名称写错了,应该写成instr(1,T.TAKEY,"tk")>0,应该是连接的表的第一个表的字段名,而不是最后一个字段名。连接后的表的字段名如果没指定的话,应该默认为第一个表的字段名。所以你的T.TCKEY为NULL,所以Instr(1, T.TCKEY, "tk")返回值为null,不能与0进行比较,会出现错误。

    看看instr()函数的联机帮助,instr()的返回值可能有null的情况。
    instr帮助如下:
    函数:InStr([start, ]string1, string2[, compare])
    返回值
    如果 InStr                返回
    string1 的长度为零          0
    string1 为 Null            Null
    string2 的长度为零          start
    string2 为 Null            Null
    找不到 string2            0
    在 string1 中找到了 string2  找到匹配项的位置
    start > string2            0
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-09 09:59:4824楼 得分:0
    在access中用通配符也能实现。在sql中因为效率问题,用like的较少。(不过access中是否有效率问题我就不太清楚了)

    SELECT * FROM (
    SELECT TAKEY,TACONTENT FROM TA表
    UNION ALL
    SELECT TBKEY,TBCONTENT FROM TB表
    UNION ALL
    SELECT TCKEY,TCCONTENT FROM TB表
    ) T
    WHERE T.TAKEY LIKE "*tk*"

    试一试,看是否可以。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-09 10:01:3725楼 得分:0
    引用 1 楼 chuifengde 的回复:
    看不懂
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-09 10:10:2326楼 得分:0
    先看看待会儿
    在做
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-09 11:25:4727楼 得分:0
    顶12楼的!
    修改 删除 举报 引用 回复