【问题标题】:how to write a sql query for getting this?如何编写一个 sql 查询来获得这个?
【发布时间】:2018-01-02 04:50:20
【问题描述】:

我有两张桌子。我想要得到想要的结果。

表 1

id | salary

01 | 500

04 | 300

07 | 700

表 2

id | salary

02 | 300

05 | 800

06 | 700

我想要像这样的输出

id | salary

01 | 500

02 | 300

03 | <em>null</em>

04 | 300

05 | 800

06 | 700

07 | 700

08 | <em>null</em>

09 | <em>null</em>

10 | <em>null</em>

【问题讨论】:

  • 你可以使用UNION
  • 您已标记此mysqlsql-server。是哪一个?
  • @ta.speot.is 其中任何一个。但首选是 mysql。
  • 使用联合我们无法获取缺失元素的空值。它只会合并两个表。 @匿名
  • 因此您希望 null 对缺少的 ID。 ID 的最大数量是否有限制?

标签: mysql sql sql-server


【解决方案1】:

如果您使用的是 SQL Server,那么这个解决方案可能适合您

;WITH CTE
AS(
    SELECT
        ID = 1

    UNION ALL

    SELECT
        Id = Id+1
        FROM CTE
            WHERE Id <  10
),C2
AS
(
    SELECT
        ID,
        Salary
        FROM YourTable1

    UNION ALL

    SELECT
        ID,
        Salary
        FROM YourTable2
)
SELECT
    CTE.ID,
    C2.Salary
    FROM CTE
        LEFT JOIN C2
            ON CTE.ID = C2.ID

【讨论】:

  • 用 MySQL 会怎么写?
  • MySql 不支持 CTE,所以你不能在那里尝试。
  • 但我想要一个替代方案来用 MySQL 编写它。
【解决方案2】:

这是一个替代解决方案,我使用了一个数字表并创建了带有零填充的数字(最好使用 SQL pad zeros function

其实你存储工资数据的两张表是一样的,这里只需要一个UNION或者UNION ALL 下面的 select 模拟了一个类似 UNION 案例的解决方案,但如果每个表上有两个条目,一个 id 号如“01”,则只使用第一个表薪水。请在您的情况下考虑这样的情况。

SELECT
    RIGHT(REPLICATE('0',2) + Convert(varchar(2),Number),2) as id,
    coalesce(t1.salary,t2.salary) as salary
FROM master..spt_values num
LEFT JOIN [Table 1] as t1 on t1.id = RIGHT(REPLICATE('0',2) + Convert(varchar(2),num.Number),2)
LEFT JOIN [Table 2] as t2 on t2.id = RIGHT(REPLICATE('0',2) + Convert(varchar(2),num.Number),2)
WHERE 
    Type = 'P' and Number <= 10
ORDER BY Number

【讨论】:

    【解决方案3】:

    对于 SQL Server...这应该会有所帮助..您可以将 20 替换为您需要生成的最大数量。

    ;WITH SingleDigits(Number) AS
    (
        SELECT Number
        FROM (VALUES (1), (2), (3), (4), (5), (6), (7), (8),
        (9), (0)) AS X(Number)
    )
    ,Series AS
    (
        SELECT (d1.Number+1) + (10*d2.Number) + (100*d3.Number) + (1000*d4.Number) Number
        from
        SingleDigits as d1,
        SingleDigits as d2,
        SingleDigits as d3,
        SingleDigits as d4
    )
    ,CTE1 AS ( SELECT id, salary FROM Table1 UNION ALL SELECT id, Salary from table2 )
    SELECT s.Number Id, c.salary FROM Series s 
    LEFT JOIN  CTE1 c ON s.Number = c.Id
    WHERE Number < 20
    

    【讨论】:

      猜你喜欢
      • 2015-08-03
      • 1970-01-01
      • 1970-01-01
      • 2016-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-10
      相关资源
      最近更新 更多