• sqlserver-中表的自链接


    sqlserver-表中的自链接

        为了方便,我对表进行简化,一个人能有多个活动;

    USE [luck]
    GO
    
    /****** Object:  Table [dbo].[User_Activity]    Script Date: 2017/8/20 15:14:32 ******/
    SET ANSI_NULLS ON
    GO
    
    SET QUOTED_IDENTIFIER ON
    GO
    
    CREATE TABLE [dbo].[User_Activity](
        [ID] [int] NOT NULL,
        [Actity] [nchar](100) NULL,
        [UserId] [int] NULL,
     CONSTRAINT [PK_User_Activity] 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]
    
    GO

    然后,是我们填充数据;

    问题,现在我们要选出:

    及:打球又约炮的同学;(这里查询的是,打球 and 约炮)  不是 打球 or 约炮

    有些同学的代码可能是这样的;

    SELECT [ID]
          ,[Actity]
          ,[UserId]
      FROM [luck].[dbo].[User_Activity]
      
      where [Actity]='打球' and  [Actity]='约炮'

    ---结果却是这样的

    聪明一点的同学可能会这样写:(这样写,是错的,因为,我们要的结果是,同时选择(参加了)了打球和约炮)

    SELECT [ID]
          ,[Actity]
          ,[UserId]
      FROM [luck].[dbo].[User_Activity]
      where [Actity]='打球'
      UNION ALL
      SELECT [ID]
          ,[Actity]
          ,[UserId]
      FROM [luck].[dbo].[User_Activity]
      where [Actity]='约炮'

    然后,我们再逐步的分析:(下面的代码)

       SELECT [ID],
          [Actity],
          [UserId]
      FROM [luck].[dbo].[User_Activity]
      where [Actity]='打球'
      GO
      SELECT [ID],
           [Actity],
          [UserId]
      FROM [luck].[dbo].[User_Activity]
      where [Actity]='约炮'

    结果;

    方案一的实现(INTERSECT)

    SELECT
          [UserId]
      FROM [luck].[dbo].[User_Activity]
      where [Actity]='打球' 
      --然后求一次交集;
      INTERSECT
    SELECT [UserId] FROM [luck].[dbo].[User_Activity] where [Actity]='约炮'

    方案二的实现(INNER JOIN)

    SELECT
          A.[UserId]
      FROM [luck].[dbo].[User_Activity] AS A
      INNER JOIN (
    SELECT 
           UserId,
          [Actity]
      FROM [luck].[dbo].[User_Activity]
     ) AS B
      ON A.UserId=B.UserId
      WHERE A.Actity='打球' and b.Actity='约炮'

    方案三(子查询)

    SELECT UserId
    FROM [luck].[dbo].[User_Activity]
    where [Actity]='打球' 
    AND UserId in
    (
      SELECT UserId
      FROM [luck].[dbo].[User_Activity]
      where [Actity]='约炮'
     )

    然后就一步步的,演变成我们的表自链接了~

    SELECT M.UserId FROM(
    SELECT UserId
    FROM [luck].[dbo].[User_Activity]
    where [Actity]='打球' ) M,
    (
    SELECT UserId
    FROM [luck].[dbo].[User_Activity]
    where [Actity]='约炮') N
    
    WHERE M.UserId=N.UserId

    到这一步,就已经很接近我们的表的自链接了;

    SELECT M.UserId FROM [User_Activity] M,
                         [User_Activity] N
    
    WHERE M.[Actity]='打球' AND N.[Actity]='约炮' AND
          M.UserId=N.UserId

    然后,我们再来看一些其他的实例。。。。

  • 相关阅读:
    运行pyzbar时报 Could not find module ‘libzbar-64.dll ‘or one of its dependenci的错误
    [Tips] pandas 如何根据index进行slice
    [Tips] pandas逐行遍历
    [Tips] Docker build
    [Tips] redis的key自动过期策略
    [Tips] No module named ipykernel错误
    [Tips] mac下anconda python环境中site-package的位置
    [Tips] pandas获取每月最后一天
    [Tips] docker的daemon.json设置私有镜像仓库
    [Tips] nginx端口转发
  • 原文地址:https://www.cnblogs.com/mc67/p/7400220.html
Copyright © 2020-2023  润新知