合并三个不同TSQL选择语句的最佳方法

时间:2015-11-20 18:58:21

标签: sql-server tsql

我希望从三个独立的无关表中返回一个包含四个字段的tsql语句。

一张桌子包含一个对象列表,比如水果,每个水果,我想要一个卖出购买日期和最好的日期。

因此,第一个陈述看起来像:

select fruit from fruit table -- this returns multiple rows

第二个陈述看起来像:

select sellbuyDate from sellTable -- this returns a single row

,第三个看起来像:

select bestbefore from bestTable -- this returns a single row

不要挂在桌面名称上。我正在研究遗留系统,我们无法改变,因此需要将这三个表合并为一个。

下划线表需要在一行中返回所有字段,第二个和第三个结果应用于第一个语句。

苹果| 12-12-2008 | 2009年12月12日

梨子| 12-12-2008 | 2009年12月12日

我已经实现了以下临时表:

CREATE TABLE #Fruits
( 
Fruit VARCHAR(100),
SellBuyDate DATETIME,
BestBefore DATETIME
) 
INSERT INTO #Fruits
   SELECT Fruit from fruit
INSERT INTO #Fruits
  SELECT sellbuyDate from sellTable
INSERT INTO #Fruits
  SELECT bestbefore from bestable
SELECT * from #Fruits

这会引发错误,因为每个插入都不包含指定的三个字段。

任何其他建议都会很受欢迎。

4 个答案:

答案 0 :(得分:1)

也许你正在寻找这个答案,虽然你的问题可以更清楚地说明会取得什么成就

INSERT INTO #Fruits(fruit)
   SELECT Fruit from fruit
INSERT INTO #Fruits(sellbuyDate)
  SELECT sellbuyDate from sellTable
INSERT INTO #Fruits(bestbefore)
  SELECT bestbefore from bestable
SELECT * from #Fruits

另一种可能的解决方案是

insert into #Fruits
select Fruit, sellbuyDate, bestbefore from fruit
        cross join sellTable
        cross join bestable

答案 1 :(得分:1)

您可以通过执行CROSS JOIN一起选择它们,方法是不指定三个表之间的任何连接条件,如下所示:

CREATE TABLE fruit ( fruit_name VARCHAR(30) );

CREATE TABLE sellTable ( sellByDate DATETIME );

CREATE TABLE bestTable ( bestBefore DATETIME );

CREATE TABLE allFruits
(
    fruit_name VARCHAR(30),
    sellByDate DATETIME,
    bestBefore DATETIME
);

INSERT INTO fruit (fruit_name)
VALUES ('apple'), ('pear');

INSERT INTO sellTable(sellByDate)
VALUES ('12/05/2012');

INSERT INTO bestTable(bestBefore)
VALUES ('12/12/2012');

INSERT INTO allFruits (fruit_name, bestBefore, sellByDate)
SELECT f.fruit_name, b.bestBefore, s.sellByDate
FROM fruit f, bestTable b, sellTable s;

SELECT *
FROM allFruits;

答案 2 :(得分:0)

可能你需要这个。

SELECT FRUIT,
       (SELECT SELLBUYDATE FROM SELLTABLE) AS SELLBUYDATE,
       (SELECT BESTBEFORE FROM BESTTABLE) AS BESTBEFORE
FROM FRUIT

SELECT FRUIT.FRUIT
     , SELLTABLE.SELLBUYDATE
     , BESTTABLE.BESTBEFORE 
FROM FRUIT
INNER JOIN SELLTABLE ON 1=1
INNER JOIN BESTTABLE ON 1=1

答案 3 :(得分:-1)

没有3个表的架构。我猜其中的一个。

CREATE TABLE #Fruits
( 
Fruit VARCHAR(100),
SellBuyDate DATETIME,
BestBefore DATETIME
) 
INSERT INTO #Fruits(Fruit,SellBuyDate,BestBefore)
Select Fruit, Sellbuydate,bestbefore
from fruit,selltable,bestable

或者如果您的表格设置正确

INSERT INTO #Fruits(Fruit,SellBuyDate,BestBefore)
Select Fruit, Sellbuydate,bestbefore
from fruit f
inner join selltable s
on f.pkey = s.fkey
inner join bestable b
on f.pkey = b.fkey