【问题标题】:Cartesian product using sql server使用 sql server 的笛卡尔积
【发布时间】:2015-12-02 12:42:50
【问题描述】:

我确实对使用 SQL SERVER 2012 的笛卡尔积有疑问。

这是我的示例查询:

SELECT A1.*
   ,RIGHT('00000' + A1.SampleID,5) AS [RealSampleID]

FROM
(
SELECT 
    ARS1.SampleID
   ,ARS1.SampleNo
FROM TblSamples AS ARS1
GROUP BY 
     ARS1.SampleNo
    ,ARS1.SampleID
) AS [A1]
INNER JOIN 
(
SELECT 
    ARS2.SampleID
   ,ARS2.SampleNo
FROM TblSamples AS ARS2
WHERE ISNUMERIC(ARS2.SampleID) = 0
GROUP BY 
     ARS2.SampleNo
    ,ARS2.SampleID
) AS A2
ON A1.SampleNo=A2.SampleNo

我的查询结果

预期结果:

Cartesian product Formula: 非数字 SampleID X 数字 SampleID 每个 SampleNo

例子:

所有样品编号137。我们在 SampleID 列中有两个数值(277 和 278)和一个不同的非数值(R00137)。那么这个非数字值(R00137)的 RealSampleID 将是 00277 和 00278。就像我们在上面的图像输出中看到的一样。

【问题讨论】:

  • 能否提供两张表的样本数据?
  • 试试 ISNUMERIC(ARS2.SampleID) = 1RIGHT('00000' + A2.SampleID,5) AS [RealSampleID] - 你希望表 A2 保存“正确”的样本 ID
  • SELECT A1.*, RIGHT('00000' + A1.SampleID,5) AS [RealSampleID] - 所有字段都以 A1 为前缀,没有 A2;您预期结果的最后一行是不可能的。

标签: sql-server cartesian-product


【解决方案1】:

如果没有样本数据,这可能不是您想要的,但这是笛卡尔积:

SELECT A1.*
   ,RIGHT('00000' + A1.SampleID,5) AS [RealSampleID]
FROM
(
SELECT 
    ARS1.SampleID
   ,ARS1.SampleNo
FROM TblSamples AS ARS1
GROUP BY 
     ARS1.SampleNo
    ,ARS1.SampleID
) AS [A1],
(
SELECT 
    ARS2.SampleID
   ,ARS2.SampleNo
FROM TblSamples AS ARS2
WHERE ISNUMERIC(ARS2.SampleID) = 0
GROUP BY 
     ARS2.SampleNo
    ,ARS2.SampleID
) AS A2

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2012-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-29
  • 2015-09-06
相关资源
最近更新 更多