zoukankan      html  css  js  c++  java
  • 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

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

  • 相关阅读:
    927小程序繁星计划峰会 · 看完这七大话题 你会更了解阿里小程序
    不吹不黑,今天我们来聊一聊 Kubernetes 落地的三种方式
    虽然他们说是水题,但我觉得思想蛮好的
    新学dfs(看懂了)
    01背包,死记硬背(我是真的蠢)
    装箱问题(太笨、还没想通)
    高精度乘法,string中的坑
    双十一用python秒杀京东好货!
    高精度减法用string 和 stack
    n阶汉诺塔 记住吧。。
  • 原文地址:https://www.cnblogs.com/mc67/p/7400220.html
Copyright © 2011-2022 走看看